3

我正在向我的网站添加不显眼的 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 可以允许页面缓存,但还有其他方法可以实现这一点。)

或者也许有更好的解决方案。

4

1 回答 1

1

Rails 可以自动执行此操作。例如,您创建 2 个布局(application.html.erbapplication.js.erb)。什么时候请求是 xhr?它将使用 js( application.js.erb) 布局,如果标准请求到达服务器 rails 将呈现application.html.erb

于 2013-02-08T10:41:42.183 回答