我很难理解 Rails 3.2 在使用可安装引擎时如何应用布局。
场景:我正在构建一个引擎,它本身具有仪表板 View 和用于各种管理功能的管理 View 。我希望仪表板的布局可以被基本应用程序覆盖(如果用户愿意),但管理员应该始终使用自己的布局。
这是我目前在引擎中拥有的东西;
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'
我希望仅适用于引擎/管理 Controller - 但如果我重新启动服务器并访问引擎/管理路径,我会看到红色背景,而引擎的 Root View 使用基本应用程序黄色布局。
如果我再次重新启动服务器并访问已安装引擎的根目录,我会应用红色背景,该背景也会保留在引擎管理路径上。
啊啊啊啊啊啊!
根据首先访问应用程序的哪个路径,预期的行为是否会使用不同的应用程序布局?确定不是??我一定做错了什么!
最佳答案
我已经调试了这个问题,实际上它不是引擎中的错误。问题是由加载 rails 依赖项的方式引起的。
此代码在您展示的 2 个场景中的行为会有所不同:
module Enginedemo
class DashboardController < ApplicationController
end
end
如果
ApplicationController
已经加载,rails 会假设我们只是想使用它,而你实际上不会从 Enginedemo::ApplicationController
继承。但来自 ApplicationController
.在另一种情况下,当您第一次加载引擎的 Controller 时,ApplicationController
还没有加载,所以 Rails 做了正确的事情。值得庆幸的是,此问题仅发生在开发环境中,因为在应用程序启动时会加载生产 Controller 。
我不确定这是否可以在 Rails 依赖项中轻松修复,我会看看它。
现在,请明确要求应用程序 Controller :
require 'enginedemo/application_controller'
module Enginedemo
class DashboardController < ApplicationController
end
end
关于ruby-on-rails - Rails 3.2 引擎布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10042348/