我有一个响应 HTML 和 JS (AJAX) 查询的 FooController:
# app/controllers/foo_controller.rb:
class FooController < ApplicationController
layout 'foo'
def bar
respond_to do |format|
format.html # foo/bar.html.erb
format.js # foo/bar.js.erb
end
end
end
支持它的模板:
# app/views/layouts/foo.html.erb:
<html>...<%= yield %>...</html>
# app/views/layouts/foo.json.erb:
<%= yield %>
还有一个 AJAX 模板,我想在其中呈现部分内容:
# app/views/foo/bar.js.erb:
dojo.byID('some_div').innerHTML = "<%= escape_javascript(render(:partial => 'some/partial')) %>";
如果 JS 模板中只有普通的旧 JS(如alert('hi');
),它使用我的 JS 模板。但是,当我放入 render(:partial) 时,它会使整个响应使用 HTML 模板,这意味着它不再是有效的 JS。
一种可能的解决方案是使用布局函数:
class FooController < ApplicationController
layout :choose_layout
...
private
def choose_layout
return nil if request.xhr?
'foo'
end
end
但我的版本应该可以工作!为什么不呢?