2012-04-06 88 views
18

我很努力地理解Rails 3.2在使用可安裝引擎時如何應用佈局。Rails 3.2引擎佈局

場景:我正在構建一個引擎,它本身具有用於各種管理功能的儀表板視圖和管理視圖。我希望儀表板的基本應用程序覆蓋其佈局(如果用戶需要),但管理員應始終使用其自己的佈局。

這就是我在我的引擎內的時刻;

application_controller.rb

module Myengine 
    class ApplicationController < ActionController::Base 

管理/ 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' 

,我會希望只適用於發動機/管理控制器 - 但如果我重新啓動服務器,訪問引擎/管理路徑我看到了紅色的背景,同時發動機的根視圖使用基本應用程序黃色的佈局。

如果我再次重新啓動服務器並訪問掛載引擎的根目錄,我會應用紅色背景,並保留在引擎管理路徑中。

Aaaaarggggghhhhh!

根據首先訪問應用程序的哪個路徑,預期行爲是否具有不同的應用程序佈局?當然不是?我一定做錯了什麼!

+0

我注意到https://github.com/grigio/rails_container_and_engines相同的行爲:(但我的引擎主題追加到main_app一個與< %= stylesheet_link_tag request.env [「action_dispatch.routes」]。routes.routes [0] .defaults [:controller],:media =>「all」%> – grigio 2012-04-10 22:55:30

回答

15

我調試過這個問題,實際上它不是引擎中的錯誤。該問題是由加載軌道依賴關係的方式引起的。

此代碼將表現不同的2種情況,你顯示:

module Enginedemo 
    class DashboardController < ApplicationController 
    end 
end 

如果ApplicationController已經加載了,Rails會認爲我們只是想用它,你會其實不是從Enginedemo::ApplicationController繼承,但從ApplicationController。在另一種情況下,當你第一次加載引擎的控制器時,ApplicationController尚未加載,所以Rails做的是正確的事情。

謝天謝地,只有在開發環境中才會出現此問題,因爲應用程序引導時會加載生產控制器。

我不確定這是否可以很容易地固定在rails依賴關係中,我會看看它。

現在,請明確要求應用控制器:

require 'enginedemo/application_controller' 

module Enginedemo 
    class DashboardController < ApplicationController 
    end 
end 
+18

或者,也可以引用右側常量:'class DashboardController < Enginedemo :: ApplicationController',所以你不必在任何地方明確地加載它。 – 2012-04-17 23:00:05

+1

謝謝,我在Rails 4.2.1上遇到同樣的問題。三年後,答案仍然非常有用。 – dusan 2015-06-16 18:33:15

+0

I he 'require_dependency'宏也可用於這些情況的需求。 – Epigene 2016-01-18 13:54:30