我正在向我的网站添加不显眼的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可能允许页面缓存,但还有其他方法可以实现此目的。)
或者可能有更好的解决方案。
答案 0 :(得分:1)
Rails可以自动执行此操作。例如,您创建了2个布局(application.html.erb
和application.js.erb
)。当请求是xhr?它将使用js(application.js.erb
)布局,如果标准请求到达服务器rails将呈现application.html.erb
。