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


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

我怎么能做到这一点 默认?即,我希望能够写作

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

并具有功能

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

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


9364
2018-03-15 03:07


起源

不能让AJAX调用使用不同的URL吗? - Mike DeSimone


答案:


这个怎么样?

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

11
2018-03-15 23:18



并在Rails 3中工作! - gertas


为了使它成为默认值 决不 为任何XHR请求呈现布局,您可以这样做:

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

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

这不同于说 controller.request.xhr? ? false : 'application',既然如此 总是 渲染 application 非XHR请求的布局,通过继承有效地禁用查找。

另见 ActionView文档 为了 nil 参数和布局继承。


4
2017-09-18 12:52





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


1
2018-03-15 03:13



这不起作用 - 只是打电话 render 立即(在我的控制器有机会为我的视图设置环境之前) - Tom Lehman
当然,过滤器在这里不起作用......我的坏!更新的解决方案是否可以解决问题? - anshul