2014-05-12 10 views
9

Tôi đã viết công cụ tùy chỉnh trong ứng dụng Rails của mình. Tôi kích hoạt nó trong config/initializers/instrumentation.rb tập tin như thế này:Rails tải lại các lớp học và 'đã được loại bỏ khỏi cây mô-đun nhưng vẫn hoạt động!' ArgumentError

ActiveSupport.on_load(:action_controller) do 
    include FooBar::ControllerRuntime 
end 

Nhưng điều này dẫn tôi đến sai sót A copy of FooBar::ControllerRuntime has been removed from the module tree but is still active!. Tôi hình dung nó ra mà tôi có thể giải quyết nó theo hai cách:

  • Thêm đường dẫn nơi có thể 'foobar :: ControllerRuntime is defined to config.autoload_one_paths`
  • Xác định :to_prepare callback trong ActionController::Railtie

giải pháp ngoại hình thứ hai như thế này:

config.to_prepare do 
    ActionController.include FooBar::ControllerRuntime 
end 

Giới thiệu dài này dẫn đến câu hỏi: cách nào tốt hơn? Lần đầu tiên tôi vô hiệu hóa việc nạp lại các lớp nằm trong cùng một đường dẫn như FooBar::ControllerRuntime của tôi. Với thứ hai tôi không cảm thấy nó là tốt để messup với ActionController::Railtie. Phải biết ActionController::Railtie không có định nghĩa to_prepare nhưng những gì happend nếu trong phiên bản tiếp theo nó sẽ có?

Trả lời

4

Phương pháp đầu tiên có vẻ sạch hơn -

con đường Thêm nơi có thể 'foobar :: ControllerRuntimeis định nghĩa toconfig.autoload_one_paths`

Lý -

1) Nếu bạn thực sự muốn làm một số bản vá lỗi khỉ trong tệp như lib/extensions.rb, bạn có thể yêu cầu thủ công:

trong đồng nfig/initializers/require.rb:

yêu cầu "# {Rails.root}/lib/extensions"

2) Làm theo các quy ước đặt tên thích hợp khi bạn sẽ phải liệt kê xuống lớp và mô-đun.

Tôi sẽ không đề xuất tự động tải cho ứng dụng sản xuất, nhưng nếu đó là tùy chọn cuối cùng bạn chắc chắn có thể dùng thử.

Đọc tốt ở đây trên cùng một - http://www.williambharding.com/blog/technology/rails-3-autoload-modules-and-classes-in-production/

Các vấn đề liên quan