【问题标题】:Rails 3.2 Engine LayoutsRails 3.2 引擎布局
【发布时间】:2012-04-20 00:06:23
【问题描述】:

我很难理解 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'

我希望仅适用于引擎/管理控制器 - 但如果我重新启动服务器并访问引擎/管理路径,我会看到红色背景,而引擎的根视图使用基本应用程序黄色布局。

如果我再次重新启动服务器并访问已安装引擎的根目录,我会应用红色背景,该背景也会保留在引擎管理路径上。

啊啊啊啊啊啊啊!

根据首先访问应用程序的哪个路径来使用不同的应用程序布局是否是预期行为?确定不是??我一定是做错了什么!

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-3 rails-engines


【解决方案1】:

我已经调试了这个问题,实际上它不是引擎中的错误。问题是由 Rails 依赖项的加载方式引起的。

此代码在您展示的 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

【讨论】:

  • 或者,或者,引用正确的常量:class DashboardController &lt; Enginedemo::ApplicationController 这样您就不必在任何地方显式加载它。
  • 谢谢,我在 Rails 4.2.1 上遇到了同样的问题。三年过去了,这个答案还是很有用的。
  • 我听说require_dependency 宏也可以用来代替这些情况的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多