簡體   English   中英

Rails可安裝發動機並覆蓋另一個發動機

[英]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/vi‌​ews]> 

可安裝引擎的最后一條路徑應該位於中間設計路徑之前。 解決方案是在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM