永远不要渲染布局以响应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时设置布局以覆盖它。 有点难看,但应该工作。