18

マウント可能なエンジンを使用するときに Rails 3.2 がレイアウトを適用する方法を理解するのに苦労しています。

シナリオ: ダッシュボード ビューとさまざまな管理機能の管理ビューを備えたエンジンを構築しています。ダッシュボードのレイアウトをベース アプリケーションでオーバーライドできるようにしたい (ユーザーが望む場合) が、管理者は常に独自のレイアウトを使用する必要があります。

現時点でエンジン内にあるものは次のとおりです。

application_controller.rb

module Myengine
  class ApplicationController < ActionController::Base

admin/dashboard_controller.rb

module Myengine                                                                                                          
  class Admin::DashboardController < ApplicationController

現在、エンジン application.html.erb に恐ろしい赤い背景を適用させ、ベース アプリケーションの application.html.erb には心地よい黄色の背景を使用させているため、どのアプリケーション レイアウトが適用されているかを区別できます。

この状況で、最初にベース アプリケーションにアクセスすると、(ベース アプリケーションからの) 黄色の背景が表示され、エンジンとエンジン管理パスの両方に移動すると、黄色の背景が残ります。

サーバーを再起動して最初にエンジンにアクセスすると、エンジンとエンジンの管理パスの背景が赤く表示され、ベース アプリケーションの背景は黄色になります。

admin/dashboard_controller.rb を次のように変更すると、

module Myengine
  class Admin::DashboardController < ApplicationController
    layout 'myengine/application'

これは、エンジン/管理コントローラーにのみ適用されると予想されますが、サーバーを再起動してエンジン/管理パスにアクセスすると、エンジンのルート ビューがベース アプリケーションの黄色のレイアウトを使用している間、赤い背景が表示されます。

サーバーを再起動してマウントされたエンジンのルートにアクセスすると、赤い背景が適用され、エンジンの管理パスにも残ります。

あああああああああああ!

アプリケーションのどのパスが最初にアクセスされるかに応じて、使用されるアプリケーションのレイアウトが異なるというのは想定される動作ですか? きっとない?? 私は何か間違ったことをしているに違いない!

4

1 に答える 1

15

問題をデバッグしましたが、実際にはエンジンのバグではありません。この問題は、Rails の依存関係が読み込まれる方法が原因で発生します。

このコードは、表示している 2 つのシナリオで異なる動作をします。

module Enginedemo
  class DashboardController < ApplicationController
  end
end

が既にロードされている場合ApplicationController、Rails はそれを使用したいだけであると想定し、実際には からではEnginedemo::ApplicationControllerなく から継承しApplicationControllerます。もう 1 つのシナリオでは、最初にエンジンのコントローラーをロードしたときに、ApplicationControllerまだロードされていないため、Rails は正しいことを行います。

ありがたいことに、この問題は開発環境でのみ発生します。本番環境では、アプリケーションの起動時にコントローラーがロードされるからです。

これがレールの依存関係で簡単に修正できるものかどうかはわかりませんが、調べてみます。

今のところ、明示的にアプリケーション コントローラーを要求してください。

require 'enginedemo/application_controller'

module Enginedemo
  class DashboardController < ApplicationController
  end
end
于 2012-04-17T22:42:59.070 に答える