Tại sao tất cả các trình trợ giúp Rails đều có sẵn cho mọi chế độ xem, mọi lúc? Có cách nào để vô hiệu hóa điều này?


89

Tại sao tôi có thể truy cập các phương thức của trình trợ giúp cho một bộ điều khiển trong các dạng xem cho một bộ điều khiển khác? Có cách nào để vô hiệu hóa điều này mà không cần hack / vá lỗi Rails không?


3
Có một câu trả lời mới phù hợp hơn. Kiểm tra Craig Walkers câu trả lời
EE33

Câu trả lời:


106

Phương thức của @George Schreiber không hoạt động với Rails 3.1; mã đã thay đổi đáng kể.

Tuy nhiên, bây giờ có một cách tốt hơn để tắt tính năng này trong Rails 3.1 (và hy vọng là sau này). Trong config / application.rb của bạn, hãy thêm dòng này:

config.action_controller.include_all_helpers = false

Điều này sẽ ngăn ApplicationController tải tất cả các trình trợ giúp .

(Đối với bất kỳ ai quan tâm, đây là yêu cầu kéo mà tính năng được tạo .)


Tôi đang ở trên 3.2. Application.config ở đây có nghĩa là config / application.rb?
Brandon Henry

Liệu ApplicationHelper có được bao gồm không nếu tôi vô hiệu hóa include_all_helpers hay tôi cần đưa vào theo cách thủ công?
Robert Audi

@AzizLight Tôi không chắc, vì tôi chưa thử nghiệm, điều đó. Tuy nhiên, tôi mong đợi như vậy, vì ApplicationHelper được thiết kế để luôn có sẵn trong các dạng xem với tư cách là trình trợ giúp "gốc". Đó là những người trợ giúp từ các bộ điều khiển không liên quan là vấn đề chính ở đây.
Craig Walker

3
Tôi nghĩ rằng đây nên là hành vi mặc định.
Nafaa Boutefer

98

Câu trả lời phụ thuộc vào phiên bản Rails.

Đường ray> = 3.1

Thay đổi include_all_helperscấu hình thành falsetrong bất kỳ môi trường nào bạn muốn áp dụng cấu hình. Nếu bạn muốn cấu hình áp dụng cho tất cả các môi trường, hãy thay đổi nó trong application.rb.

config.action_controller.include_all_helpers = false

Khi sai, nó sẽ bỏ qua phần bao gồm .

Đường ray <3,1

Xóa dòng sau khỏi ApplicationController

helper :all

Bằng cách này, mỗi bộ điều khiển sẽ tải các trình trợ giúp của riêng mình.


2
Dòng này không tồn tại đối với tôi trong Rails 3.2, vì vậy giải pháp này có thể không còn áp dụng cho các phiên bản sau của Rails.
Tyler Collier

@TylerCollier đã nói gì!
EE33

Tôi muốn biết tại sao điều này lại thay đổi đáng kể từ phiên bản Rails lên 3.1? Không có nhiều ý nghĩa đối với tôi.
Joshua Muheim

6
Chú ý: Các ý kiến trên là không còn giá trị, bây giờ mà câu trả lời đã được cập nhật để bao gồm Rails> 3.1
Kyle Heironimus

3
Lưu ý: ApplicationHelper của bạn sẽ vẫn được tải. Nếu bạn luôn muốn bao gồm bất kỳ người trợ giúp cụ thể nào, bạn có thể thêm include HelperNamevào đầu ApplicationHelper của mình.
vansan

27

Trong Rails 3, actioncontroller/base.rb(xung quanh dòng 224):

def self.inherited(klass)
  super
  klass.helper :all if klass.superclass == ActionController::Base
end

Vì vậy, có, nếu bạn lấy được lớp của mình ActionController::Base, tất cả các trợ giúp sẽ được đưa vào.

Để giải quyết vấn đề này, hãy gọi clear_helpers( AbstractClass::Helpers; bao gồm trong ActionController::Base) ở đầu mã bộ điều khiển của bạn. Nhận xét mã nguồn cho clear_helpers:

# Clears up all existing helpers in this class, only keeping the helper
# with the same name as this class.

Ví dụ:

class ApplicationController < ActionController::Base
  clear_helpers
  ...
end

10
Vào thời điểm bạn gọi clear_helpers, thiệt hại (hiệu suất) đã được thực hiện vì tất cả các trình trợ giúp đã được tải. Bạn thực sự muốn sử dụng config.action_controller.include_all_helpers = false(như @Craig Walker nói ở trên), vì nó ngăn chặn việc tải các trình trợ giúp ngay từ đầu, do đó giúp bạn đạt được một số hiệu suất (có lẽ đáng kể nhất trong chế độ phát triển). Cảm ơn bạn đã bao gồm actioncontroller/base.rbđoạn mã; thật tuyệt khi xem mã và loại bỏ một số bí ẩn.
George Anderson

clear_helpersvẫn hữu ích cho rails 3.0 - config.action_controller.include_all_helpers = falsechỉ là rails 3.1 trở lên.
robd

5

Thực tế trong Rails 2 , chức năng mặc định của ActionController :: Base là bao gồm tất cả các trình trợ giúp.

Changeset 6222 on 02/02/07 20:33:47 (3 years ago) by dhh : Đặt giả định mặc định rằng bạn muốn mọi người trợ giúp, mọi lúc (vâng, vâng)

thay đổi:

class ApplicationController < ActionController::Base 
  helper :all # include all helpers, all the time 
end 

Kể từ Rails 3 beta 1, điều đó không còn xảy ra như đã lưu ý trong CHANGELOG:

  • Đã thêm rằng ActionController :: Base hiện thực hiện trợ giúp: tất cả thay vì dựa vào ApplicationController mặc định trong Rails để làm việc đó [DHH]

1
vậy điều đó có nghĩa là trong Rails 3, tất cả các helper đều được tải theo mặc định?
Nik So

@Nik chắc chắn có, ít nhất cho 3,2
Nithin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.