Страница не показывает обновленную информацию после вызова ajax в рельсах - PullRequest
0 голосов
/ 19 декабря 2011

У меня есть rails 3.1, и когда я использую ajax для операции удаления, на странице не отображается обновленное содержимое без обновления вручную.

Странно то, что весь код .js.erb запускается правильно. Я даже пытался поместить простой page.alert ('hi') в destroy.js.erb, но после удаления я не получаю никаких предупреждений. Я видел пару мест, где упоминалось добавление тега «script» для ajax в представлении, чтобы заставить работать jquery, но ни в одном из последних учебников об этом не упоминается. Я буду признателен за вашу помощь.

Вот что я вижу в логах сервера:

Started DELETE "/categories/35" for 127.0.0.1 at 2011-12-19 12:58:15 -0500
  Processing by CategoriesController#destroy as JS
  Parameters: {"id"=>"35"}
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 5 LIMIT 1
  Category Load (0.3ms)  SELECT "categories".* FROM "categories" WHERE "categories"."user_id" = 5 AND "categories"."id" = ? LIMIT 1  [["id", "35"]]
  SQL (0.5ms)  DELETE FROM "categories" WHERE "categories"."id" = ?  [["id", 35]]
Rendered categories/destroy.js.erb (0.5ms)
Completed 200 OK in 161ms (Views: 30.7ms | ActiveRecord: 3.2ms)

Вот что я вижу в сгенерированном источнике страницы вывода html-страницы:

...
 <tr id = "category_35">
    <td>High-end products</td>
    <td class="deletebutton"><a href="/categories/35" data-confirm="Are you sure?" data-method="delete" data-remote="true" rel="nofollow">Delete</a></td>
  </tr>

 <tr id = "category_36">
    <td>Economy products</td>
    <td class="deletebutton"><a href="/categories/36" data-confirm="Are you sure?" data-method="delete" data-remote="true" rel="nofollow">Delete</a></td>
  </tr>

Содержимое destroy.js.erb:

('#<%= dom_id(@category) %>').fadeOut(700);

В Gemfile:

gem 'jquery-rails'

In Categories_controller.rb:

  def index
      @categories = current_user.categories.all
    respond_to do |format|
      format.html # index.html.erb
      format.json 
      format.js
    end
  end

  def destroy
      @category.destroy

    respond_to do |format|
        format.html { redirect_to categories_url }
        format.js { 
            render :template => 'categories/destroy.js.erb', :layout => false 
        }
    end
  end

В приложении / views / Categories / index.html.erb

<h2>Categories</h2>
<table name="categories_list">
<%= render "categories_list" %>
</table>    
<br />

В частичном _categories_list.html.erb

<% @categories.each do |category| %>
  <tr id = "<%= dom_id(category)%>">
    <td><%= category.name %></td>

    <td class="deletebutton"><%= link_to 'Delete', category, confirm: 'Are you sure?', method: :delete, :remote => true  %></td>
  </tr>
<% end %>

1 Ответ

1 голос
/ 20 декабря 2011

Хорошо, на всякий случай, если кто-то наткнется на этот вопрос, я хотел бы поделиться решением.Существовало около 3 важных вещей:

  1. Знак $ в destroy.js.erb отсутствовал.Вот исправленный код:

    $ ('# <% = dom_id (@category)%>'). FadeOut (700);

  2. Также контроллернеобходимо указать НЕ использовать макеты по умолчанию при ответе на .js.Это можно сделать в самом контроллере приложения.Но я сделал это в контроллере категорий следующим образом:

    response_to do | format |format.html {redirect_to Categories_url} format.json format.js {render "destroy»,: layout => false}

  3. Кроме того, в какой-то момент во время итерации я запутал формат.JSON с форматом.Это две разные вещи!Поскольку я новичок в RoR, я подумал, что ответ на вызовы ajax будет json, а format.json аналогичен формату.js.

Наконец, я должен поблагодарить Марка, который поделился демо ajax на github по адресу: https://github.com/markusproske/ajax_demo/tree/jquery

Дополнительное изменение, которое я должен был сделатьчтобы заставить его работать, я отключил отображение макета.В противном случае, эта демонстрация является полной.Я все еще смотрю на обработку условий ошибки для вызовов js.

...