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

时间:2010-03-15 03:07:54

标签: ruby-on-rails ajax

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

如何将默认设为?即,我希望能够写出

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

并具有

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

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

3 个答案:

答案 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时设置布局以覆盖它。有点难看,但应该工作。