【问题标题】:Rails 4.0.0 is not sending proper response after using a jQuery $.get()Rails 4.0.0 在使用 jQuery $.get() 后没有发送正确的响应
【发布时间】:2014-02-22 04:33:28
【问题描述】:

我有以下问题:我正在使用带有 jQ​​uery 的 Rails 4.0.0,并且我有一条要删除的评论。我的javascript如下:

  // deleting a comment
   $('#delete_comment').click( function(event) {                              
       event.preventDefault()
       var elem = $(this).parents().eq(3)                                     
       var url = event.target.href                                            
       $.get(url, function(data) {                                            
         elem.empty()                                                         
         elem.remove()                                                        
       })                                               
   }) 

我也尝试在每次点击触发之前使用 $(document).on('click'...etc)...我有 $(document).ready (function () { .. 包含我所有的点击事件

我的 HTML 是:

 <div class="comment row">
    <div class="col-md-6 col-md-offset-2">
        <h5><small>another goof commend </small>Alexandra</h5>
         <h6><small><a autofocus="autofocus" href="/comment_destroy?comment%5Bentry_id%5D=164&amp;id=161" id="delete_comment">delete</a></small></h6>
   </div>
</div>

当我第一次点击删除评论时,我从服务器收到以下响应:

Started GET "/comment_destroy?comment%5Bentry_id%5D=164&id=160" for 127.0.0.1 at 2014-01-29 19:40:09 -0700
Processing by CommentsController#destroy as */*
  Parameters: {"comment"=>{"entry_id"=>"164"}, "id"=>"160"}
  User Load (1.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Comment Load (4.6ms)  SELECT "comments".* FROM "comments" WHERE "comments"."id" = $1 LIMIT 1  [["id", "160"]]
  Entry Load (0.5ms)  SELECT "entries".* FROM "entries" WHERE "entries"."id" = $1 LIMIT 1  [["id", "164"]]
   (0.2ms)  BEGIN
  SQL (0.3ms)  DELETE FROM "comments" WHERE "comments"."id" = $1  [["id", 160]]
   (0.5ms)  COMMIT
  Rendered comments/destroy.html.erb within layouts/application (0.1ms)
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
Completed 200 OK in 25ms (Views: 12.1ms | ActiveRecord: 7.4ms)

这是我要的回复,评论被删除,不重载页面……

但是,当我删除第二条评论时,我收到以下回复:

Started GET "/comment_destroy?comment%5Bentry_id%5D=164&id=162" for 127.0.0.1 at 2014-01-29 19:41:00 -0700
Processing by CommentsController#destroy as HTML
  Parameters: {"comment"=>{"entry_id"=>"164"}, "id"=>"162"}
  User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Comment Load (0.3ms)  SELECT "comments".* FROM "comments" WHERE "comments"."id" = $1 LIMIT 1  [["id", "162"]]
  Entry Load (0.3ms)  SELECT "entries".* FROM "entries" WHERE "entries"."id" = $1 LIMIT 1  [["id", "164"]]
   (0.1ms)  BEGIN
  SQL (0.3ms)  DELETE FROM "comments" WHERE "comments"."id" = $1  [["id", 162]]
   (0.6ms)  COMMIT
  Rendered comments/destroy.html.erb within layouts/application (0.1ms)
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
Completed 200 OK in 12ms (Views: 5.6ms | ActiveRecord: 2.7ms)


Started GET "/assets/bootstrap.css?body=1" for 127.0.0.1 at 2014-01-29 19:41:00 -0700

它们之间的主要区别是Processing by CommentsController#destroy as */* 在第一个请求上,Processing by CommentsController#destroy as HTML 在第二个响应上。

奇怪的是,只有顶行的 cmets 会产生我想要的响应。

我已经从我的 Rails 应用程序中完全删除了 Turbolinks,并且我尝试了许多其他的方法,例如使用 jquery-turbolinks...我已经阅读了许多其他关于如何让 Rails 4.0.0 工作的问题使用 jQuery,但似乎没有一致的答案,到目前为止,没有任何建议对我有用。我已经花费了无数个小时来调试这个问题,但我束手无策。

在使用 jQuery 和 Rails 方面,有没有人有任何决定性的、明确的、确定的建议?只是不推荐吗?核心团队是如何在不知道 jQuery 有这么多漏洞的情况下发布带有 Rails 的 Turbolinks 的?我很混乱!请帮忙:)

【问题讨论】:

    标签: jquery ruby-on-rails-4 turbolinks


    【解决方案1】:

    关于将 jQuery 与 Rails 结合使用(特别是使用 AJAX)的结论性、明确、肯定的建议:

    如果您碰巧手动包含 jQuery,请改为在 gemfile 中使用 gem 'jquery-rails',并在 application.js 文件中包含 //= require jquery 行。

    确保您使用 jquery_ujs(在您的应用程序 js 文件中包含 //= require jquery_ujs 行)

    按照https://github.com/rails/jquery-ujs/wiki 上的文档,使用链接上的 data-remote 属性使您的删除功能正常工作,并允许 jquery ujs 处理尽可能多的 ajax 内容。

    jquery_ujs 库将为您节省大量时间和痛苦。它应该可以与 TurboLinks 一起正常工作。

    【讨论】:

    • 酷,感谢您的回答。我已经在我的 Gemfile 中有:gem 'jquery-rails'、"~> 2.3.0" 和 //= 需要 jquery_ujs 和 //= 在我的 application.js 文件中需要 jquery。我去看看链接
    • 任何特定版本的 jQuery 可以工作?还是有关系?
    • 我正在使用 jquery-rails (3.0.4) 并且没有遇到任何问题。
    【解决方案2】:

    好的,终于成功了。之所以只删除第一条评论,是因为我对每条评论都有一个#id标签,而在HTML规则中,只有一个元素可以有一个id,所以我将其修改为一个类:

    <%= link_to 'delete', comment_destroy_path(:comment=>entry.id=>comment.entry_id}, :id=>comment.id), :class=>"delete_comment" %>
    

    在我的 javascript 中,我做了以下操作:

     // deleting a comment
     $(document.ready(function() { 
        $(a.delete_comment').click ( function (event) {
          var elem = $(this).parents().eq(3);
          var url = event.target.href;
          $.ajax({
             url: url,
             beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token',$('meta[name="csrf-token"]').attr('content'))},
             success: function () {
                  elem.empty();
                  elem.remove();
             }
           })
           event.preventDefault()
        })
     })
    

    在我的 config/routes.rb 文件中,我有:

    controller :comments do 
      get 'comment_destroy' => :destroy
    end
    

    自从我用 DELETE 调用它之前,由于某种原因它正在处理 GET..

    【讨论】:

    • 继续前进,您仍然应该查看 jquery_ujs。它将为您节省未来的时间。真的很不错。
    • 好的,很酷,谢谢 :) 我已经包含了它,但我不太熟悉它。我去看看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 2014-10-07
    • 2013-04-21
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多