6

標準の Rails アプリをマウント可能なエンジンに変換中です。このアプリは標準のブログ アプリに匹敵し、すべてのモデル、コントローラー、ビューを拡張可能にしたいので、マウント可能なエンジンを選択しました。

私が使用している宝石の 1 つは 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ロードされていません。代わりに、標準の Devise ログイン ビューが読み込まれます。devise-2.1.0/app/views/devise/sessions/new.html.erb

もちろん、上記の registrations_controller で行ったように、すべてのコントローラーを独自のコントローラーでオーバーライドすることでこの問題を解決できますが、これは非常に見苦しく見えます。これを行う方法は、すべてのコントローラーをオーバーライドすることですか? 別のマウント可能なエンジン内からマウント可能なエンジンからのビューをオーバーライドするより便利な方法はありますか?

4

3 に答える 3

7

config.railties_orderエンジンを使用するすべてのアプリでを調整したくない場合は、 lib\my_engine\engine.rbファイルのすぐrequire 'devise'上に追加します。

于 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あなたの友達ですので、レールコンソールで次のことを試してください:

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

これにより、各コントローラーがテンプレートを検索している場所をよりよく理解できます。

于 2012-06-29T09:58:30.067 に答える