【发布时间】:2010-09-22 23:09:08
【问题描述】:
我有一个响应 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
但我的版本应该工作!为什么不呢?
【问题讨论】:
-
我认为它不起作用的原因是一个小错误:我有一个 .json.erb 模板,但没有 .js.erb 模板,也没有默认的 .erb 模板。
标签: javascript ruby-on-rails ruby erb