25

Tôi đã tìm thấy một số bài viết giải quyết vấn đề người trợ giúp trong một công cụ không thể truy cập được vào ứng dụng tiêu thụ (cha mẹ). Để đảm bảo chúng tôi là tất cả trên cùng một trang, chúng ta hãy nói rằng chúng ta có điều này:Rails 3.1: Cách tốt hơn để hiển thị trình trợ giúp của động cơ trong ứng dụng khách

module MyEngine 
    module ImportantHelper 
    def some_important_helper 
     ...do something important... 
    end 
    end 
end 

Nếu bạn nhìn vào các tài liệu rails engine trong "những người giúp đỡ Isolated động cơ của" người (L293), nó nói:

# Sometimes you may want to isolate engine, but use helpers that are defined for it. 
    # If you want to share just a few specific helpers you can add them to application's 
    # helpers in ApplicationController: 
    # 
    # class ApplicationController < ActionController::Base 
    # helper MyEngine::SharedEngineHelper 
    # end 
    # 
    # If you want to include all of the engine's helpers, you can use #helpers method on an engine's 
    # instance: 
    # 
    # class ApplicationController < ActionController::Base 
    # helper MyEngine::Engine.helpers 
    # end 

Vì vậy, nếu tôi hỏi ai tiêu thụ động cơ của tôi để thêm video này vào application_controller.rb của họ, sau đó họ sẽ nhận được quyền truy cập vào tất cả các phương pháp helper quan trọng của tôi:

class ApplicationController < ActionController::Base 
    helper MyEngine::ImportantHelper 
end 

Đây là những gì tôi muốn và tôi t hoạt động, nhưng đó là một loại đau, đặc biệt là nếu, như là trường hợp sử dụng của tôi, tất cả mọi thứ công cụ phơi bày có thể/nên được sử dụng bất cứ nơi nào trong ứng dụng tiêu thụ. Vì vậy, tôi đào xung quanh một chút nhiều hơn và tìm thấy một giải pháp mà đề nghị tôi thực hiện như sau:

module MyEngine 
    class Engine < Rails::Engine 
    isolate_namespace MyEngine 

    config.to_prepare do 
     ApplicationController.helper(ImportantHelper) 
    end 
    end 
end 

Bây giờ đây là chính xác những gì tôi muốn: để thêm tất cả phương pháp ImportantHelper tôi để helper ứng dụng ứng dụng của cha mẹ. Tuy nhiên, nó không hoạt động. Ai có thể giúp tôi tìm ra lý do tại sao giải pháp này tốt hơn không hoạt động?

Tôi đang chạy ruby ​​1.8.7 với đường ray 3.1.3. Hãy cho tôi biết nếu tôi bỏ lỡ bất kỳ thông tin quan trọng nào về vấn đề này và cảm ơn trước.

Trả lời

44

Bạn có thể tạo một initializer để thực hiện điều này như sau:

module MyEngine 
    class Engine < Rails::Engine 
    initializer 'my_engine.action_controller' do |app| 
     ActiveSupport.on_load :action_controller do 
     helper MyEngine::ImportantHelper 
     end 
    end 
    end 
end 
+0

Bạn thực sự có thể đơn giản hóa hơn nữa để: helper MyEngine :: ImportantHelper with gửi đi. Tôi đã cập nhật bài đăng của mình. – JDutil

+0

Điều này có thay đổi không? Dường như * tất cả * người giúp đỡ của tôi được tải tự động mà không cần mã ở trên! Đây là công cụ của tôi: https: // github.com/sientia-jmu/iq_menu –

+0

Nó thực sự có vẻ như tất cả những người giúp đỡ được bao gồm tự động cho mọi bộ điều khiển, ít nhất là khi có một động cơ '--full'. –

1
module YourEngine 
    module Helpers 
    def a_helper 
    end 

    ... 
    end 
end 

ActionController::Base.send(:helper, YourEngine::Helpers) 
6

Tôi đã viết hai bài đăng trên blog về việc tạo động cơ từ đầu, và sau đó tất cả mọi thứ nên làm việc như mong đợi (không có cấu hình bổ sung cần thiết). Có lẽ bạn vẫn còn quan tâm đến:

Cập nhật: Đó là ba điều trong khi chờ đợi, và vẫn còn một số thông tin sắp tới. Xin vui lòng cho tôi phản hồi.

+0

Liên kết đã chết: / – Waclock

6

Nếu bạn muốn giữ lại mã kiểm tra vào động cơ, thay vì mỗi ứng dụng triển khai, sử dụng này:

module MyEngine 
    class Engine < Rails::Engine 
    isolate_namespace MyEngine 

    config.to_prepare do 
     MyEngine::ApplicationController.helper Rails.application.helpers 
    end 

    end 
end 
1

Bao gồm mã này trong engine.rb cũng rất hữu ích

config.before_initialize do 
    ActiveSupport.on_load :action_controller do 
    helper MyEngine::Engine.helpers 
    end 
end 

Về cơ bản, động cơ của bạn sẽ trông giống như

module MyEngine 
    class Engine < Rails::Engine 
    isolate_namespace MyEngine 

    # Here comes the code quoted above 

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