我遇到了一个奇怪的问题,我无法解释Rails 3和渲染部分布局(来自控制器).我希望有人可以提供一些有关正在发生的事情的见解.
首先,我们将此控制器称为"传统"控制器.它已经存在了很长时间,并且做了很多错事,但我现在不打算重构它,所以我试图找到合作方式来处理我们拥有的东西.
这个new动作是这样的(在BarsController)
def new
if something
render :partial => "foo", :layout => "bars"
elsif something_else
render :partial => "foo2", :layout => "bars"
elsif something_else_else
render :partial => "foo3", :layout => "bars"
else
render :partial => "foo4", :layout => "bars"
end
Run Code Online (Sandbox Code Playgroud)
现在,在Rails 2.3.5中,这很好用.它会在适当的布局中呈现适当的部分 - 我意识到布局选项在这里是多余的,因为无论如何都会默认为条形布局.当我们升级到Rails 3.0.x时,我们开始收到如下错误:
Missing partial layouts/bars with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html]
Run Code Online (Sandbox Code Playgroud)
很明显,layouts/bars.html.erb文件一直存在,所以我无法理解.我能够渲染:layout => false,但那当然不会起作用.最终我发现,如果我执行以下任一操作,它会起作用:
1)重命名我的布局_bars.html.erb而不是bars.html.erb和:
render :partial => 'foo2', :layout => 'bars' …
我最近从gem版本切换resources_controller到了依赖plugin的gem版本git.
在vendor/plugins/plugin/lib/plugin.rb文件内部,Railtie如下:
module Ardes
module ResourcesController
class Railtie < Rails::Railtie
initializer 'ardes.resources_controller' do
ActiveSupport.on_load(:action_controller) do
extend Ardes::ResourcesController
include Ardes::ResourcesController::RequestPathIntrospection
end
ActiveSupport.on_load(:active_record) do
include Ardes::ActiveRecord::Saved
end
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
我已经require 'resources_controller'在我的一个初始化程序中添加了一个并正确加载此文件.问题是虽然Railtie被评估(puts类块中的一个将被击中),但它似乎永远不会实际调用初始化块本身.这当然很重要,因为这是扩展ActionController到包括resources_controller_for方法的地方.
这个问题似乎已经出现在这里和这里.虽然在这两种情况下他们都找到了解决问题的其他方法,但没有直接回答为什么没有调用块.
从我在Rails文档中可以看出,您可以将初始化程序块命名为您想要的任何内容,并且它应该运行.我认为这不重要,但我在生产中运行时首先注意到了这个问题,rails s -e production但我相信在开发模式中存在同样的问题.
可能会发生什么?
作为参考,完整的插件在这里:https://github.com/ianwhite/resources_controller