永远不要渲染布局以响应xhrs

大多数时候,当请求来自AJAX时,我不想呈现布局。 为此我一直在写render :layout => !request.xhr? 经常在我的控制器动作中。

我该如何将其设为默认值 ? 也就是说,我希望能够写作

 def new Post.find(params[:id]) end 

并具有function

 def show Post.find(params[:id]) render :layout => !request.xhr? end 

(我很乐意在极少数情况下手动指定布局,我想使用它。)

这个怎么样?

 class UsersController < ApplicationController layout proc {|controller| controller.request.xhr? ? false : "application" } end 

为了使其成为永久不为任何XHR请求呈现布局的默认设置,您可以这样做:

 class ApplicationController < ActionController::Base layout proc { false if request.xhr? } end 

当请求是XHR请求时,它会在没有布局的情况下呈现请求的视图。 否则,它使用默认布局行为,该行为通过inheritance查找布局。

这与说controller.request.xhr? ? false : 'application'不同controller.request.xhr? ? false : 'application' controller.request.xhr? ? false : 'application' controller.request.xhr? ? false : 'application' ,因为它总是呈现非XHR请求的application布局,这有效地禁用了inheritance查找。

另请参阅有关nil参数和布局inheritance的ActionView文档 。

普通的after_filter不起作用,因为我们想要修改渲染。

劫持渲染怎么样?

 class ApplicationController < ActionController::Base private def render(options = nil, extra_options = {}, &block) options = {:layout => !request.xhr?}.merge(options) unless options.nil? super(options, extra_options) end end 

调用render时设置布局以覆盖它。 有点难看,但应该工作。