我遇到的问题是rails并没有在模板中实际执行JS。我的控制器中有一个响应阻塞,如下所示:
respond_to do |format|
format.js {}
end
和视图中的正确文件,但是当它呈现它实际上只是打印JS,就像mime类型是错误的。 (文件为add_item.js.erb
)
例如,如果我在我看来将其作为测试:
<%= "alert('running');" %>
但是当在控制器中执行该操作时,页面重定向并且HTML输出是JS本身:
alert('running');
答案 0 :(得分:1)
Rails的这种行为是正确的。但是,您没有提供在视图中调用此JS页面的方式(link_to_remote
?)
大多数人忘记了其他JS辅助方法(link_to_remote
等)执行eval(response)
。如果您编写自定义JavaScript(就像我使用jQuery一样),您必须自己添加eval(...)
。
编辑这是一个例子:
$.ajax({
url: "foo",
type: 'post',
success: function(data) {
eval(data);
}
});
答案 1 :(得分:1)
我打算对作者的答案发表评论,但发布的代码太多了......你可以稍微收紧JS。首先,你可能想要全局设置标题,而不是每次请求都设置标题,如果你要发帖,你需要做更多的工作:
$(document).ajaxSend(function(event, xhr, settings) {
xhr.setRequestHeader("Accept", "text/javascript, application/javascript");
});
使用getScript也会缩短代码:
$("a.add_line_item").click(function() {
.getScript(this.href);
});
我还有一个blog post关于从jQuery发送你可能感兴趣的Rails的请求。
答案 2 :(得分:0)
试试这个:
<script type="text/javascript">
<%= "alert('running');" %>
</script>
不确定您要做什么,但您不能简单地在浏览器中加载一些javascript文本代码并期望它能够运行。
答案 3 :(得分:0)
你是怎么称呼这个行动的?您是否在远程助手中使用:更新选项?
如果你使用一个带有:update选项集的远程帮助器然后尝试使用控制器端的rjs发回一个特定的replace_html或类似的调用,我已经看到它的行为方式。
答案 4 :(得分:0)
知道了,这是一个JS问题,我正在使用jQuery提供的ajax方法。
$("a.add_line_item").click( function() {
$.ajax({
url: this.href,
dataType: "script",
beforeSend: function(xhr) {xhr.setRequestHeader("Accept", "text/javascript");},
});
return false;
});