[英]Rails mountable engine and overriding another engine
我正處於將標准Rails應用程序轉換為可安裝引擎的過程中。 該應用程序可與標准博客應用程序相媲美,我希望每個模型,控制器和視圖都可以擴展,因此我選擇了可安裝的引擎。
我使用的寶石之一是Devise,據我所知,這是一種可安裝的引擎本身。 它可以在這里所述的可安裝發動機內使用。
我可以在我的引擎中部分使用它。 一切都很好,包括一些Devise控制器我覆蓋像這樣:
# 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
...
正確的視圖'views / bbronline / devise_overrides / registrations / new_intermediair.html.haml'也按預期正確加載。
但是我的問題是我沒有自定義控制器覆蓋的視圖沒有正確加載。 例如,登錄視圖應位於views/bbronline/devise/sessions/new.html.haml
中且未加載的views/bbronline/devise/sessions/new.html.haml
。 而是加載標准的Devise登錄視圖,即devise-2.1.0/app/views/devise/sessions/new.html.erb
當然我可以通過用我自己的控制器覆蓋每個控制器來解決這個問題,就像我上面的registrations_controller一樣,但這看起來非常難看。 是否覆蓋每個控制器的方式? 是否有更方便的方法從另一個可安裝引擎中覆蓋可安裝引擎的視圖?
如果您不想在使用引擎的每個應用程序中調整config.railties_order
,只需在lib \\ my_engine \\ engine.rb文件的頂部require 'devise'
。
view_paths的順序不正確。 檢查Devise :: SessionsController的視圖路徑顯示:
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/views]>
可安裝引擎的最后一條路徑應該位於中間設計路徑之前。 解決方案是在application.rb中設置加載優先級,如下所示:
#test/dummy/config/application.rb (the app that uses my mountable engine)
...
config.railties_order = [Blog::Engine, :main_app, :all]
...
這也記錄在rails api中: http : //api.rubyonrails.org/classes/Rails/Engine.html#label-Loading+priority
感謝JoséValim指向正確的方向。
我需要更多信息。 您定義了哪個控制器以及它從哪個控制器繼承? 正在渲染哪個視圖以及您希望渲染哪個視圖? 另外, .view_paths
是你的朋友,所以請在rails控制台中嘗試以下操作:
Devise::SessionsController.view_paths
YourApp::SomeDeviseController.view_paths
這將使您更好地了解每個控制器搜索模板的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.