Добавление ссылки Удалить для вложенных атрибутов


У меня есть вложенные атрибуты в моем шоу.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 %>

Я хочу, чтобы link_to 'Destroy' работал, но я получаю undefined method 'plural' , Когда я добавляю это в сетку

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

3 ответа:

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

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

<%= l.check_box '_destroy' %>

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

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

Далее следует отправить обновление на сервер как ajax, чтобы обработать обновление страницы в файле обратного вызова или JS view. Удалить 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

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

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

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