大多数时候,当请求来自AJAX时,我不想呈现布局。为此,我一直在我的控制器操作中经常写render :layout => !request.xhr?
。
如何将默认设为?即,我希望能够写出
def new
Post.find(params[:id])
end
并具有
功能def show
Post.find(params[:id])
render :layout => !request.xhr?
end
(我很乐意在极少数情况下手动指定布局,我想使用它。)
答案 0 :(得分:10)
这个怎么样?
class UsersController < ApplicationController
layout proc {|controller| controller.request.xhr? ? false : "application" }
end
答案 1 :(得分:5)
为了使其成为 never 为任何XHR请求呈现布局的默认设置,您可以这样做:
class ApplicationController < ActionController::Base
layout proc { false if request.xhr? }
end
当请求是XHR请求时,它会在没有布局的情况下呈现请求的视图。否则,它使用默认布局行为,它通过继承查找布局。
这与说controller.request.xhr? ? false : 'application'
不同,因为总是为非XHR请求呈现application
布局,这有效地禁用了继承查找。
另请参阅ActionView documentation了解nil
参数和布局继承。
答案 2 :(得分:1)
普通的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时设置布局以覆盖它。有点难看,但应该工作。