大多数时候,当请求来自AJAX时,我不想呈现布局。为此,我一直在写作 render :layout => !request.xhr?
经常在我的控制器动作中。
我怎么能做到这一点 默认?即,我希望能够写作
def new
Post.find(params[:id])
end
并具有功能
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请求时,它会在没有布局的情况下呈现请求的视图。否则,它使用默认布局行为,该行为通过继承查找布局。
这不同于说 controller.request.xhr? ? false : 'application'
,既然如此 总是 渲染 application
非XHR请求的布局,通过继承有效地禁用查找。
另见 ActionView文档 为了 nil
参数和布局继承。
普通的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时设置布局以覆盖它。有点难看,但应该工作。