rails: доступ к переменной не экземпляра в js.erb - PullRequest
0 голосов
/ 04 декабря 2011

У меня есть страница, которая отображает несколько форм.В настоящее время, когда пользователь отправляет любую из этих форм, он обновляет (через ajax) элемент div на той же странице с содержимым формы, которую только что отправили.

Я также хочу удалить () формуэлемент, который был только что отправлен после того, как запрос поста ajax завершен.Однако для этого мне нужно иметь доступ к этому конкретному идентификатору формы в файле js.erb.

Так как моя страница имеет x количество форм, которые отображаются динамически, я не могу просто получить доступ к переменной экземпляра в моем js.erb.

Страница:

<% for peer_review in @peer_reviews %>
    <%= render :partial => 'form', :locals => { :peer_review => peer_review } %>
<% end %>

<div id="completed_peer_reviews">
    <%= render 'completed_peer_reviews' %>
</div>

@peer_reviewsПеременная экземпляра содержит массив новых объектов PeerReview, уже содержащих некоторые данные.

Форма:

<div id="peer_review_form_<%= peer_review.reviewee_id %>">
<%= form_for peer_review, :html => { :method => "post" }, :remote => true do |f| %>
  <%= f.error_messages %>
  <p>
    Peer Review for: <%= User.find(peer_review.reviewee_id).name %><br />
  </p>
  <p>
    <%= f.label :rating %>: 
    <%= f.select :rating, [1, 2, 3, 4, 5], { :include_blank => 'None' } %>
  </p>
  <p>
    <%= f.label :review %><br />
    <%= f.text_area :review %>
  </p>

  <%= f.hidden_field :user_id, :value => peer_review.user_id %>
  <%= f.hidden_field :reviewee_id, :value => peer_review.reviewee_id %>
  <%= f.hidden_field :review_period_id, :value => peer_review.review_period_id %>

  <p><%= f.submit "Submit" %></p>
<% end %>
</div>

js.erb:

$("#completed_peer_reviews").html("<%= escape_javascript(render('completed_peer_reviews')) %>");

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

$("#peer_review_form_<%= peer_review.reviewee_id %>").remove();

Как я на самом деле должен ссылаться на peer_review.reviewee_id здесь?Или я должен использовать совершенно другой подход?

1 Ответ

3 голосов
/ 04 декабря 2011

Это один из классических выпусков шаблонов RJS.

Быстрый ответ:

Если вы просто хотите решить проблему, вы можете передать временный идентификатор для идентификации формы.Например:

# in the index
<% @peer_reviews.each.with_index do |peer_review, i| %>
  <%= render :partial => 'form', 
             :locals  => { :peer_review => peer_review, :i => i } %>
<% end %>

# then in the form (note, you don't need to specify POST in a form_for)
<div id="peer_review_form_<%= i %>">
  <%= form_for peer_review, :remote => true do |f| %>
    <%= hidden_field_tag 'temp_id', i %>

# finally in the create js.erb
$("#peer_review_form_<%= params[:temp_id] %>").remove();

Более длинный ответ:

При этом , в то время как шаблоны RJS долгое время были "путём Rails", онис тех пор как разошлись.

Более современный метод - это, как правило, шаблоны JS на стороне клиента с JSON API, а не запуск сгенерированных сервером шаблонов JS (RJS).Это имеет много преимуществ, одно из которых заключается в том, что проблема привязки DOM, с которой вы столкнулись сейчас, больше не существует.

Это пример того, как вы можете сделать это с чистым jQuery, но есть много вариантов шаблоновтам.

<script id="peer_review_tmpl" type="text/x-jquery-tmpl">
  <div class="completed_peer_review">
    <p>${review}</p>
    ...
  </div>
</script>

Затем вы создадите обработчик и свяжете его с успешным ответом ajax.Для этого потребуется, чтобы ваше действие peer_reviews#create ответило JSON:

$('form.new_peer_review').bind("ajax:success", function(data) {
  // remove the form which triggered the creation        
  $(this).remove();

  // then render the data into a template, and append it to the list
  $("#peer_review_tmpl").tmpl(data).appendTo("#completed_peer_reviews"); 
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...