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?
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?
Câu trả lời:
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 .)
Câu trả lời phụ thuộc vào phiên bản Rails.
Thay đổi include_all_helpers
cấu hình thành false
trong 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 .
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.
include HelperName
vào đầu ApplicationHelper của mình.
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
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.
clear_helpers
vẫn hữu ích cho rails 3.0 - config.action_controller.include_all_helpers = false
chỉ là rails 3.1 trở lên.
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: