Rails没有从respond_to块执行javascript

时间:2009-12-01 23:27:13

标签: ruby-on-rails

我遇到的问题是rails并没有在模板中实际执行JS。我的控制器中有一个响应阻塞,如下所示:

respond_to do |format|
  format.js   {}      
end

和视图中的正确文件,但是当它呈现它实际上只是打印JS,就像mime类型是错误的。 (文件为add_item.js.erb

例如,如果我在我看来将其作为测试:

<%= "alert('running');" %>

但是当在控制器中执行该操作时,页面重定向并且HTML输出是JS本身:

alert('running');

5 个答案:

答案 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;
});