2012-06-29 18 views
6

Tôi đang trong quá trình chuyển đổi ứng dụng Rails tiêu chuẩn sang một công cụ gắn kết. Ứng dụng này có thể so sánh với ứng dụng viết blog chuẩn và tôi muốn mọi mô hình, bộ điều khiển và chế độ xem có thể mở rộng do đó lựa chọn của tôi cho một công cụ có thể gắn kết.Động cơ có thể lắp trên ray và ghi đè một công cụ khác

Một trong những viên đá quý tôi sử dụng là Devise, đó là theo như tôi hiểu một loại động cơ gắn kết chính nó. Nó có thể được sử dụng bên trong một động cơ gắn kết như đã nêu here.

Tôi có thể sử dụng nó một phần trong công cụ của mình. Tất cả mọi thứ đang làm việc tốt trong đó có một số bộ điều khiển lập mưu i ghi đè như thế này:

# config/routes.rb 

Bbronline::Engine.routes.draw do 
    devise_for :users, class_name: "Bbronline::User", module: :devise, 
    controllers: { registrations: "bbronline/devise_overrides/registrations"} 
    ... 

# controllers/bbronline/devise_overrides/registrations_controller.rb 
require_dependency "bbronline/application_controller" 

module Bbronline 

class DeviseOverrides::RegistrationsController < Devise::RegistrationsController 

    def new_intermediair 
    @user = User.new 
    end 
    ... 

Quan điểm đúng 'views/bbronline/devise_overrides/đăng ký/new_intermediair.html.haml' cũng đang tải một cách chính xác như mong đợi.

Tuy nhiên, vấn đề của tôi là các chế độ xem mà tôi ghi đè mà không có bộ điều khiển tùy chỉnh không được tải đúng cách. Ví dụ: chế độ xem mà chế độ xem đăng nhập sẽ nằm ở views/bbronline/devise/sessions/new.html.haml và không được tải. Thay vào đó, chế độ xem đăng nhập Devise chuẩn được tải xuống tức là devise-2.1.0/app/views/devise/sessions/new.html.erb

Tất nhiên tôi có thể giải quyết vấn đề này bằng cách ghi đè mọi bộ điều khiển bằng bộ điều khiển của riêng mình như tôi đã làm với đăng ký_controller ở trên nhưng điều này có vẻ rất xấu. Là trọng lượng mỗi bộ điều khiển cách để làm điều này? Có cách nào thuận tiện hơn để ghi đè chế độ xem từ một công cụ có thể gắn kết từ bên trong một công cụ gắn kết khác không?

Trả lời

4

View_paths theo thứ tự không chính xác. Kiểm tra các đường dẫn quan điểm của lập mưu :: SessionsController cho thấy:

Devise::SessionsController.view_paths 
=> #<ActionView::PathSet:0x007fa1bf0e36f8 @paths= [/Users/harmdewit/Dropbox/Code/projects/brightin/bbr-online/bbr-online-gem/test/‌​dummy/app/views, 
/Users/harmdewit/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/devise-2.1.‌​0/app/views, 
/Users/harmdewit/Dropbox/Code/projects/brightin/bbr-online/bbr-online-gem/app/vi‌​ews]> 

Con đường cuối cùng của động cơ mountable nên đến trước khi con đường devise giữa. Các giải pháp được thiết lập các ưu tiên tải trong application.rb như thế này:

#test/dummy/config/application.rb (the app that uses my mountable engine) 
... 
config.railties_order = [Blog::Engine, :main_app, :all] 
... 

này cũng được ghi nhận ở các đường ray api: http://api.rubyonrails.org/classes/Rails/Engine.html#label-Loading+priority

Nhờ José Valim để chỉ đi đúng hướng.

+2

Bất kỳ cách nào tôi có thể thực hiện thay đổi này mà không phải thay đổi cấu hình của ứng dụng giả của tôi? Tôi muốn thực hiện hành vi mặc định này bất cứ khi nào tôi tải đá quý của mình. – Ajedi32

1

Tôi cần thêm thông tin. Bạn đang xác định bộ điều khiển nào và bộ điều khiển nào được kế thừa từ bộ điều khiển nào? Chế độ xem nào đang được hiển thị và bạn đã mong đợi kết xuất nào? Ngoài ra, .view_paths là bạn của bạn vì vậy hãy thử ở đường ray của bạn an ủi như sau:

Devise::SessionsController.view_paths 
YourApp::SomeDeviseController.view_paths 

này sẽ cung cấp cho bạn một ý tưởng tốt hơn về nơi mà mỗi bộ điều khiển đang tìm kiếm mẫu.

+0

Tôi không xác định bộ điều khiển, tôi chỉ muốn ghi đè chế độ xem. Cụ thể hơn, tôi muốn ghi đè chế độ xem nằm trong 'devise-2.1.0/app/views/devise/sessions/new.html.erb' mà không ghi đè bộ điều khiển. Điều này có thể không? –

+0

Oh .view_paths hiển thị: Devise :: SessionsController.view_paths => # Bbronline :: SessionsController không tồn tại tất nhiên, tôi không ghi đè lên nó –

+1

Nếu bạn không muốn sử dụng bộ điều khiển tùy chỉnh, chỉ cần ghi đè lên xem, chỉ cần đặt chế độ xem mới của bạn tại: 'your-engine/app/views/devise/sessions/new.html.erb' và đảm bảo công cụ của Devise được tải trước công cụ gắn kết của bạn (chỉ cần thiết lập trước). Một lần nữa, gọi '.view_paths' trong' Devise.parent_controller' hoặc trong trình điều khiển ứng dụng của bạn sẽ cho bạn biết thứ tự tra cứu mẫu. –

7

Nếu bạn không muốn điều chỉnh config.railties_order trong mọi ứng dụng có sử dụng động cơ của bạn, chỉ cần require 'devise' trên đầu trang của lib \ my_engine \ engine.rb tập tin của bạn.

+1

Yay, nó đã hoạt động! +1 – Ajedi32

+1

Trong khi các câu trả lời khác cung cấp thông tin chi tiết để khám phá view_paths, đây là câu trả lời nếu động cơ của bạn có nghĩa là tải và tùy chỉnh các công cụ khác – prusswan

+0

đã lưu cuộc sống của tôi = D –

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