Добавление ссылки удаления для вложенных атрибутов - PullRequest
7 голосов
/ 22 августа 2011

У меня есть вложенные атрибуты в моем show.erb, и я создаю пустой вложенный атрибут и показываю сетку элементов с пробелом внизу, вот так.

<%= form_for @question do |q| %>
  <% q.fields_for :answers, @question.answers do |l| %>
    <tr>

      <td><%= l.text_field :text %></td>
      <td><%= l.check_box :correct %></td>
      <td><%= l.text_field :imagename %></td>
      <td><%= l.number_field :x %></td>
      <td><%= l.number_field :y %></td>
    </tr>
  <% end %>

  <tr>
        <td colspan=5 align=right><%= submit_tag '+' %>
  </tr>

<% end %>

Я хочу ссылку_для «Уничтожить»работать, но я получаю undefined method 'plural', когда я добавляю это в сетку

<%= link_to 'Destroy', l, :controller => "answer", :confirm => 'Are you sure?', :method => :delete %>

Ответы [ 3 ]

22 голосов
/ 22 августа 2011

Почему вы хотите использовать ссылку?Вы также можете использовать функцию уничтожения во вложенных атрибутах.

Все, что вам нужно сделать, это добавить :allow_destroy => true в ваше определение accepts_nested_attributes и добавить

<%= l.check_box '_destroy' %>

к каждой записи.Таким образом он удаляет все вложенные записи с установленным флажком при сохранении записи.

9 голосов
/ 22 января 2013

Для тех, кто находит это в Google, хотя технически флажок удаления может быть правильным способом, я думаю, что это сбивает с толку - единственное преимущество состоит в том, что для удаления требуется два щелчка (установите флажок и нажмите обновить)).Может быть, лучше просто убедиться, что удаление ясно, что происходит, и, возможно, добавить простой способ получить его обратно.

Далее необходимо отправить обновление на сервер в виде ajax, чтобы обработать обновление страницы.в обратном вызове или просмотр файла JS.Remove remote: true, и он будет работать как обычная ссылка.

# For my form I build a new object if it's missing,
# so I need to check that this is not a new nested attribute.
- unless question.answers.new_record?
  # Basically, I am sending over the fields that would be sent
  # by the _delete check box form being updated.
  = link_to "Delete", question_path(question.id, question: { answers_attributes: { id: question.answers.id, "_destroy" => true }}), remote: true, confirm: "Really delete?", method: :put
1 голос
/ 22 августа 2011

Используемая вами переменная l неверна. Когда вы выходите из блока fields_for, блочный объект является экземпляром FormBuilder, а не экземпляром самого объекта. На какой URL вы хотите указать ссылку? Это Answers#destroy? Какой идентификатор вы хотите отправить на это действие, чтобы определить, что нужно уничтожить? link_to не является элементом формы. Это просто помощник для тега привязки. Для создания этой ссылки вам нужен URL, а не конструктор форм.

Это будет список форм ответов? По одному на каждый ответ? Если это так, вы можете циклически просматривать их, а не просто использовать fields_for.

Надеюсь, это поможет вам встать на правильный путь.

...