1

这个问题是我昨天问的一个问题,它涉及将模型的创建/编辑功能移动到其索引页面上。我遇到的最后一个问题是,当我去删除一个模型时,我有一些应该运行的 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

我的部分帖子列表(其中包含我所指的销毁链接):

<table>
  <tr>
    <th>Title</th>
    <th>Content</th>
  </tr>
  <% for post in @posts %>
    <tr>
      <td><%= post.title %></td>
      <td><%= post.content %></td>
      <td><%= link_to "Edit", edit_post_path(post), :class => "edit" %></td>
      <!--
        This is the problem here... I can't seem to get it to work.
        It DOES delete the record, but then gets redirected to /posts/:id
        and displays my javascript as html.
      -->
      <td><%= link_to "Destroy", post , :confirm => 'Are you sure?', :method => :delete, :class => 'destroy' %></td>
    </tr>
  <% end %>
</table>

销毁.js.erb:

$("#post_errors").hide(300);
$("#flash_notice").html("<%= escape_javascript(flash[:notice])%>");
$("#flash_notice").show(300);
$("#posts_list").html("<%= escape_javascript( render(:partial => "posts") ) %>");

页面加载时加载的 javscript:

// Setting up the ajax requests for the forms/links.
$(document).ready(function() {
  $("#new_post").submitWithAjax();
  $("a.edit").each(function(){
    $(this).getWithAjax();
  });
  $("a.destroy").each(function(){
    $(this).postWithAjax();
  });
});

// Setting up ajax for sending javascript requests
jQuery.ajaxSetup({
  'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")}
});

jQuery.fn.submitWithAjax = function() {
  this.submit(function() {
    $.post(this.action, $(this).serialize(), null, "script");
    return false;
  });
  return this;
};

jQuery.fn.getWithAjax = function() {
  this.click(function() {
    $.get(this.href, null, null, "script");
    return false;
  });
  return this;
};

jQuery.fn.postWithAjax = function() {
  this.click(function() {
    $.post(this.href, null, null, "script");
    return false;
  });
  return this;
};

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

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

3 回答 3

3

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

jQuery.ajaxSetup({
  'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")}
});

对于POST请求,这发生得很好,但是当我想做一个PUT请求或DELETE请求时,它不会以某种方式被调用或被忽略。我意识到使用rails.jsjQuery/AJAX 插件需要被引用,因为我使用的是 HTML5。

为了使编辑和删除工作,我对我的link_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 请求。之后他们开始工作。

于 2010-10-24T11:08:11.887 回答
0

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

.js.rjs此外,对于像这样的简单情况,使用它可能会更好,因为它使您的 JavaScript 在很大程度上独立于框架。

于 2010-08-29T19:27:52.020 回答
0

我遇到了同样的问题。解决方案是使用此处提供的脚本:http
://www.danhawkins.me.uk/2010/05/unobtrusive-javascript-with-rails-2-3-5/ 使用它作为描述,删除一个对象,是使用类似于此代码的东西:

 <%= link_to "Destroy", post , :confirm => 'Are you sure?', :class => 'remote destroy' %>

对我来说,这就像一个魅力。

于 2010-09-28T11:38:26.440 回答