2012-02-10 18 views
22

Tôi đã tạo ra một Rails Engine đơn giản để cung cấp một số chức năng chung (thư viện ảnh) cho một ứng dụng. Tôi muốn có thể ghi đè lên phần _header tiêu chuẩn để trình đơn cho thư viện khớp với trình đơn chính của tôi. Trong chế độ xem tiêu đề của tôi, tôi gọi một trình trợ giúp là một phần của application_helpers (ứng dụng chính), nhưng tôi vẫn nhận được các lỗi "phương thức không xác định". Từ những gì tôi có thể nói app_helpers ứng dụng chính không được bao gồm (rõ ràng) khi tôi ghi đè lên bố trí ứng dụng động cơ hoặc partials của nó.Truy cập ứng dụng chính Helpers khi overridings một Rails Engine View/Layout

Vì vậy, câu hỏi của tôi là, làm cách nào để ghi đè chế độ xem công cụ trong ứng dụng chính và truy cập vào các phương pháp trợ giúp ứng dụng chính? Tôi vẫn cần truy cập đến những người trợ giúp động cơ cũng như không làm hỏng chức năng của động cơ.

Tôi có cần ghi đè bộ điều khiển không? dường như rất nhiều chỉ để có được một số người giúp đỡ.

Cảm ơn

Rails 3.1.3

+5

Các bạn đã thử 'main_app.your_helper_method'? – glebm

+0

Thử phương pháp được nêu trong [câu hỏi] này (http://stackoverflow.com/questions/10879150/isolated-engine-doorkeeper-use-helper-methods-from-the-main-app) nếu bạn không muốn ghi đè các bộ điều khiển – Matt

Trả lời

1

thử tạo một helper trong ứng dụng của bạn có cùng tên của helper trong công cụ của bạn để ghi đè các phương pháp cơ helper.

Tôi tìm thấy this discussion đặc biệt sâu sắc. Ngoài ra còn có một số ý tưởng thú vị trong số Rails Engine API docs dưới Người trợ giúp động cơ bị cô lập.

+0

Các tài liệu API của Rails Engine đã giúp tôi tìm ra giải pháp tốt cho url_helpers! Cảm ơn. –

2

Hãy thử bao gồm các phương pháp trợ giúp ứng dụng chính. Ví dụ:

class MyEngineClass 
    include ApplicationHelper 

    #... 
end 

Có thể bạn cần yêu cầu tệp trước, mặc dù tôi mong đợi Rails sẽ tìm đúng cách trong trường hợp này.

Sau khi ApplicationHelper được bao gồm, bạn sẽ có thể trực tiếp sử dụng những người trợ giúp trong bộ điều khiển.

Dường như bạn có thể gọi ClassName.helper("application") cho nhiều lớp Rails - không chắc chắn liệu điều đó có hoạt động ở đây hay không.

0

Tuyên bố từ chối trách nhiệm: Tôi chỉ sử dụng giải pháp này trong các công cụ Rails 3.2.

Nếu, trong công cụ của bạn, bạn có tiêu đề chuẩn một phần nhà cung cấp/đá quý/my_gallery_engine/app/views/application/_header.html.erb.

Sau đó, ghi đè lên ứng dụng chính của bạn bằng cách tạo một phần tùy chỉnh ứng dụng/lượt xem/ứng dụng/_header.html.erb.

Các override làm việc vì Rails' con đường xem mẫu tìm kiếm (theo mặc định) bắt đầu với các ứng dụng chính app/views thư mục, và sau đó tìm kiếm thông qua công cụ app/views để tải.

Tất cả những người trợ giúp ứng dụng chính của bạn sẽ có sẵn một phần.

1

Động cơ được cho là độc lập với ứng dụng chính, đó là lý do tại sao bạn không thể truy cập người trợ giúp từ Engine.

Tuy nhiên, có các cách hack-ish giúp cho công cụ của bạn truy cập vào những người trợ giúp của ứng dụng chính.Đây là cách tôi đã thực hiện:

# In the main app 
# initializers/share_helpers_path_with_engine.rb 
PhotoGallery::Engine.class_eval do 
    paths["app/helpers"] << File.join(File.dirname(__FILE__), '../..', 'app/helpers') 
end 

Bạn cần thay đổi PhotoGallery thành tên thực tế của lớp động cơ của bạn.

Hãy thoải mái để có một cái nhìn tại các tài liệu động cơ (phần về các đường dẫn): http://edgeapi.rubyonrails.org/classes/Rails/Engine.html

3

séc ra bài viết trên blog này: http://www.candland.net/2012/04/17/rails-routes-used-in-an-isolated-engine/ Tác giả cho biết thêm một định nghĩa method_missing đến helper ứng dụng để truy cập vào phụ huynh người trợ giúp của ứng dụng.

/config/initializers/blogit.rb

module Blogit 
    module ApplicationHelper 
     def method_missing method, *args, &block 
     puts "LOOKING FOR ROUTES #{method}" 
     if method.to_s.end_with?('_path') or method.to_s.end_with?('_url') 
      if main_app.respond_to?(method) 
      main_app.send(method, *args) 
      else 
      super 
      end 
     else 
      super 
     end 
     end 

     def respond_to?(method) 
     if method.to_s.end_with?('_path') or method.to_s.end_with?('_url') 
      if main_app.respond_to?(method) 
      true 
      else 
      super 
      end 
     else 
      super 
     end 
     end 
    end 
    end 
+1

Thao tác này chỉ thêm các trình trợ giúp '_path' và' _url' là tất cả những gì tôi cần. Có một giải pháp tốt hơn mặc dù. Thêm 'helper Rails.application.routes.url_helpers' vào' ApplicationController' của công cụ của bạn. Xem nhận xét của tôi về bài đăng trên blog được liên kết. –

+0

Đối với OP, bạn có thể sử dụng cùng một kỹ thuật với 'helper Rails.application.helpers'. –