6

我正在将我的标准 Rails 应用程序转换为可安装的引擎。该应用程序可与标准博客应用程序相媲美,我希望每个模型、控制器和视图都可以扩展,因此我选择了可​​挂载引擎。

我使用的其中一个宝石是 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并且未加载。相反,标准的设计登录视图被加载,即devise-2.1.0/app/views/devise/sessions/new.html.erb

当然,我可以通过使用我自己的控制器覆盖每个控制器来解决这个问题,就像我对上面的 registrations_controller 所做的那样,但这看起来很丑陋。是否覆盖每个控制器都是这样做的?有没有更方便的方法可以从另一个可安装引擎中覆盖来自可安装引擎的视图?

4

3 回答 3

7

如果您不想config.railties_order在每个使用您的引擎的应用程序中调整,只需require 'devise'在您的lib\my_engine\engine.rb文件之上。

于 2013-03-29T23:28:26.067 回答
4

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 指出了正确的方向。

于 2012-06-29T11:48:37.453 回答
1

我需要更多信息。您正在定义哪个控制器以及它从哪个控制器继承?正在渲染哪个视图,您希望渲染哪个视图?另外,.view_paths您的朋友是否可以在您的 Rails 控制台中尝试以下操作:

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

这将使您更好地了解每个控制器在哪里搜索模板。

于 2012-06-29T09:58:30.067 回答