2012-04-06 86 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