我正在向我的网站添加不显眼的 ajax,因此我需要根据请求类型设置布局:
# app/controllers/application_controller.rb
layout Proc.new { |controller| controller.request.xhr? ? 'ajax' : 'application' }
# app/views/layout/ajax.html.erb
<%= render :partial => "shared/flash", :object => flash %>
<%= yield %>
但我也想使用嵌套布局并让我的 javascript 处理在哪里插入 ajax 检索的内容。根据rails api layout nil force 默认布局行为与继承,所以我尝试了这个:
layout Proc.new { |controller| controller.request.xhr? ? 'ajax' : nil }
这不起作用,我根本没有布局。我发现的唯一一条信息是一个旧的聊天日志,它说这确实是行不通的,因为 Rails 处理布局的方式。
有没有办法做到这一点?
由于返回 nil 的 proc 不起作用,它们是一种在满足条件的情况下设置布局的方法(request.xhr?这里)。像 layout_if 这样的东西。
或者我应该添加
layout Proc.new { |controller| controller.request.xhr? ? 'ajax' : 'controller_name' }
给每个具有不同布局的控制器?
我的 ajax 请求实际上返回了 html,我应该稍微作弊并在 .xml 文件中返回那些 html 元素并使用 respond_to 来设置布局吗?(这可能很棒,出于另一个原因,在有和没有布局内容的情况下访问不同的 url 可以允许页面缓存,但还有其他方法可以实现这一点。)
或者也许有更好的解决方案。