AJAX-вызов Ruby on Rails влияет только на первый элемент коллекции - PullRequest
0 голосов
/ 19 марта 2012

Я перебираю коллекцию элементов и пытаюсь заставить AJAX правильно работать с определенным элементом в коллекции.Я вложил несколько частичек, чтобы перебрать эти элементы и использовать вызов js.erb, подобный следующему:

$('#favorite_form').html("<%=j render partial: 'shared/unfavorite', locals: { mission: @mission } %>");

Это только кажется, что изменит элемент 1-й в коллекциидаже если я могу щелкнуть 5-й элемент внизу списка, например.

Вопрос: Как я могу указать (через .js и AJAX), какой элемент обновлять?Является ли этот вызов jQuery недостаточно конкретным для отдельного элемента?Код работает в обычных HTTP-запросах, поэтому мне интересно, есть ли способ указать отдельный элемент, но я подумал, что именно это и сделали партиалы: /

Example View ( _favorites.html.erb )

<div id="favorite_form">
  <% if you_favorited_this?(current_user, mission) %>
    <%= render partial: 'shared/unfavorite', locals: { mission: mission } %>
  <% else %>
    <%= render partial: 'shared/favorite', locals: { mission: mission } %>
  <% end %>
</div>

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

Кажется, ваша проблема связана со спецификой селектора. Одна полезная вещь - использовать div_for и dom_id . Так, например, поскольку похоже, что вы выполняете «миссии»:

# mission partial
<%= div_for mission do %>
  ...the rest of the partial...
<%= end %>

В вашем js используйте что-то вроде:

$('#<%= dom_id @mission %>').html("<%=j render partial: 'shared/unfavorite', locals: { mission: @mission } %>");

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

0 голосов
/ 19 марта 2012

Если вы пытаетесь обновить только элемент, по которому щелкаете, вы можете попробовать что-то вроде этого:

$(".favorite_form").click(function() {
    $(this).html("<%=j render partial: 'shared/unfavorite', locals: { mission: @mission } %>");
});

this в функции обратного вызова будет ссылаться только на элемент, который был на самом деленажал.

...