Rails 3.2引擎布局

Joh*_*non 18 ruby-on-rails rails-engines ruby-on-rails-3

在使用可安装引擎时,我很难理解Rails 3.2如何应用布局.

场景:我正在构建一个引擎,它本身具有仪表板视图和各种管理功能的管理视图.我希望仪表板的布局可以被基础应用程序覆盖(如果用户需要),但管理员应该始终使用自己的布局.

这就是我在引擎内部的所有内容;

application_controller.rb

module Myengine
  class ApplicationController < ActionController::Base
Run Code Online (Sandbox Code Playgroud)

管理员/ dashboard_controller.rb

module Myengine                                                                                                          
  class Admin::DashboardController < ApplicationController
Run Code Online (Sandbox Code Playgroud)

现在我有我的引擎application.html.erb应用一个可怕的红色背景,而基本应用程序application.html.erb使用一个愉快的黄色背景,所以我可以区分正在应用的应用程序布局.

在这种情况下,如果我首先访问基本应用程序,我会看到我的黄色背景(来自基础应用程序),如果我同时转到引擎和引擎管理路径,黄色背景仍然存在.

如果我重新启动服务器并首先访问引擎,那么我会看到引擎和引擎管理路径的红色背景,而基本应用程序显示黄色背景.

如果我修改我的admin/dashboard_controller.rb如下;

module Myengine
  class Admin::DashboardController < ApplicationController
    layout 'myengine/application'
Run Code Online (Sandbox Code Playgroud)

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

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

Aaaaarggggghhhhh!

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

小智 15

我调试了问题,实际上它不是引擎中的错误.问题是由rails依赖项的加载方式引起的.

此代码在您显示的两个方案中的行为会有所不同:

module Enginedemo
  class DashboardController < ApplicationController
  end
end
Run Code Online (Sandbox Code Playgroud)

如果ApplicationController已经加载,rails将假定我们只想使用它而你实际上不会继承Enginedemo::ApplicationController而是从ApplicationController.在另一种情况下,当您第一次加载引擎的控制器时,ApplicationController尚未加载,因此Rails做正确的事情.

值得庆幸的是,此问题仅在开发环境中发生,因为在应用程序启动时会加载生产控制器.

我不确定这是否可以在rails依赖项中轻松修复,我将看看它.

目前,请明确要求应用程序控制器:

require 'enginedemo/application_controller'

module Enginedemo
  class DashboardController < ApplicationController
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 或者,或者,引用正确的常量:`class DashboardController <Enginedemo :: ApplicationController`,这样您就不必在任何地方显式加载它. (18认同)
  • 谢谢,我在 Rails 4.2.1 上遇到了同样的问题。三年过去了,这个答案还是很有用的。 (2认同)