使用Proc返回默认布局行为

时间:2012-10-11 18:39:38

标签: ajax ruby-on-rails-3 layout

我正在向我的网站添加不显眼的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布局nil force默认布局行为,所以我尝试了这个:

layout Proc.new { |controller| controller.request.xhr? ? 'ajax' : nil }

哪个不起作用,我根本没有布局。我找到的唯一一条信息是一条旧的聊天记录,说这确实不起作用,因为Rails处理布局的方式。

有没有办法实现这个目标?

由于proc返回nil不起作用,是否可以在满足条件的情况下设置布局(request.xhr?here)。像layout_if。

之类的东西

或者我应该添加

layout Proc.new { |controller| controller.request.xhr? ? 'ajax' : 'controller_name' }

每个具有不同布局的控制器?

我的ajax请求实际上返回了html,我是否应该作弊并返回.xml文件中的那些html元素并使用respond_to来设置布局? (这可能很棒,另一个原因是,使用和不使用布局内容访问不同的URL可能允许页面缓存,但还有其他方法可以实现此目的。)

或者可能有更好的解决方案。

1 个答案:

答案 0 :(得分:1)

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