我很难理解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 :(得分:15)
我调试了这个问题,实际上它并不是引擎中的错误。问题是由rails依赖关系的加载方式引起的。
此代码在您显示的两种方案中的行为会有所不同:
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