Ruby on rails Javascript不是在脚本中呈现的,而是作为html呈现的

Ruby on rails Javascript不是在脚本中呈现的,而是作为html呈现的,ruby-on-rails,ajax,mime,render,unobtrusive-javascript,Ruby On Rails,Ajax,Mime,Render,Unobtrusive Javascript,这个问题是我上一个问题的翻版,这个问题涉及将模型的创建/编辑功能移动到其索引页上。我遇到的最后一个问题是,当我删除一个模型时,我会运行一些javascript,重新加载模型列表以反映数据库中的更改。此js被呈现为html。以下是我认为相关的代码: 在我的控制器中: def destroy @post = Post.find(params[:id]) @post.destroy flash[:notice] = "Successfully destroyed post." @pos

这个问题是我上一个问题的翻版,这个问题涉及将模型的创建/编辑功能移动到其索引页上。我遇到的最后一个问题是,当我删除一个模型时,我会运行一些javascript,重新加载模型列表以反映数据库中的更改。此js被呈现为html。以下是我认为相关的代码:

在我的控制器中:

def destroy
  @post = Post.find(params[:id])
  @post.destroy
  flash[:notice] = "Successfully destroyed post."
  @posts = Post.all
  respond_to do |format|
    format.js {render :content_type => 'text/javascript' }
  end
end
我的帖子列表不完整(我指的是销毁链接):

要查看我使用的所有代码,请查看我发布的另一个问题,但我认为这足以看出我做错了什么。另外,当我运行chrome并单击destroy链接时,chrome会向我显示一个javascript警告:

Resource interpreted as document but transferred with MIME type text/javascript.

手动设置MIME类型可能是问题的根源。JavaScript通常作为
application/x-JavaScript
而不是
text/JavaScript
发送,因此最好由渲染引擎为您设置


对于这样的简单情况,最好使用
.js.rjs
,因为它使JavaScript在很大程度上独立于框架。

我遇到了同样的问题。 解决方案是使用此处提供的脚本:
按照说明使用对象后,要删除对象,只需使用类似于以下代码的内容:

 <%= link_to "Destroy", post , :confirm => 'Are you sure?', :class => 'remote destroy' %>
“您确定吗?”,:class=>“远程销毁”%>

对我来说,这就像一个符咒。

这个问题的答案是,在请求头中,
Accept
头应该设置为
text/javascript
或类似的内容。这应该在这个js函数中完成:

jQuery.ajaxSetup({
  'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")}
});
对于
POST
请求,这种情况发生得很好,但是当我想执行
PUT
请求或
DELETE
请求时,它不会被调用,或者被忽略。我意识到使用jQuery/AJAX的
rails.js
插件需要被引用,因为我使用的是HTML5

为了使编辑和删除有效,我对我的
link\u to
方法执行了以下操作:

link_to "Edit", edit_post_path(post), "data-remote" => 'true', 'data-method' => 'get'      
link_to "Destroy", post , "data-confirm" => 'Are you sure?', "data-remote" => 'true', "data-method" => 'delete'

将这些html属性添加到我的锚定标记中,允许
rails.js
确定我想要使用它们执行一些ajax请求。之后他们开始工作。

这不起作用。另外,将destroy.js.erb重命名为destroy.js.rjs会导致该文件中出现编译器错误。RJ不是一种比较老的方式吗?我应该能够使用.js.erb使其工作,因为它适用于我的其他ajax请求。RJS是较新的方式,但语法与.erb不同,因此您必须在脚本工作之前转换脚本。不过,如果使用正确的MIME类型,您应该不会有问题。
 <%= link_to "Destroy", post , :confirm => 'Are you sure?', :class => 'remote destroy' %>
jQuery.ajaxSetup({
  'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")}
});
link_to "Edit", edit_post_path(post), "data-remote" => 'true', 'data-method' => 'get'      
link_to "Destroy", post , "data-confirm" => 'Are you sure?', "data-remote" => 'true', "data-method" => 'delete'