Rails 4.0.0 не отправляет правильный ответ после использования jQuery $.get()

У меня следующая проблема: я использую Rails 4.0.0 с jQuery, и у меня есть комментарий, который я пытаюсь удалить. Мой 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 во втором ответе.

Как ни странно, только комментарии в верхней строке дают нужный мне ответ.

Я полностью удалил Turbolinks из своего приложения Rails и пробовал ряд других вещей, таких как использование jquery-turbolinks... Я читал множество других вопросов о том, как заставить Rails 4.0.0 работать с jQuery, но, похоже, нет последовательного ответа, и ничего из того, что было предложено, пока не сработало для меня. Я потратил бесчисленное количество часов на отладку этой проблемы, и я в своем уме.

Есть ли у кого-нибудь убедительные, определенные, обязательно работающие советы по использованию jQuery с Rails? Просто не рекомендуется? Как основная команда выпустила Turbolinks с Rails, не зная, что в jQuery столько ошибок? Я весьма озадачен! Пожалуйста помоги :)


person reectrix    schedule 30.01.2014    source источник


Ответы (2)


Убедительный, определенный, обязательно рабочий совет по использованию jQuery с Rails (в частности, с использованием AJAX):

Если вы включаете jQuery вручную, вместо этого используйте gem 'jquery-rails' в своем gemfile и включите строку //= require jquery в файл application.js.

Убедитесь, что вы используете jquery_ujs (включите строку //= require jquery_ujs в файл js вашего приложения)

Следуйте документу по адресу https://github.com/rails/jquery-ujs/wiki. чтобы ваша функция удаления работала с использованием атрибута data-remote в вашей ссылке и позволяла jquery ujs обрабатывать как можно больше материалов ajax.

Эта библиотека jquery_ujs сэкономит вам много времени и сил. И это должно прекрасно работать с TurboLinks.

person joshua.paling    schedule 30.01.2014
comment
Круто, спасибо за ответ. У меня уже были: gem 'jquery-rails', ~› 2.3.0 в моем Gemfile и //= требуют jquery_ujs и //= требуют jquery в моем файле application.js. посмотрю ссылку - person reectrix; 30.01.2014
comment
Какая-то конкретная версия jQuery работает? или это имеет значение? - person reectrix; 30.01.2014
comment
Я использую jquery-rails (3.0.4) и у меня не было с этим проблем. - person joshua.paling; 31.01.2014

Ладно, наконец-то заработало. Причина, по которой удалялся только первый комментарий, заключается в том, что у меня был тег #id для каждого комментария, а в правилах HTML только один элемент может иметь идентификатор, поэтому я изменил его на класс:

<%= 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.

person reectrix    schedule 30.01.2014
comment
Двигаясь вперед, вы все равно должны проверить jquery_ujs. Это сэкономит вам время в будущем. Это действительно приятно. - person joshua.paling; 31.01.2014
comment
comment
Ладно, прикольно, спасибо :) У меня уже включено, но я с ним не слишком знаком. я взгляну - person reectrix; 31.01.2014