Получение формы для использования: метод =>: удалить (rails)

#ruby-on-rails #forms #methods

#ruby-on-rails #формы #методы

Вопрос:

У меня есть корзина, которая содержит много line_items. Я хотел бы иметь кнопку «удалить» рядом с каждой позицией, которая при нажатии удаляет элемент line_item из корзины.

Я знаю, что могу сделать это с помощью метода button_to, но я хотел бы использовать form_for, потому что я хотел бы одновременно изменить атрибуты родительского объекта line_item (каждый line_item также принадлежит курсу, и я хотел бы сообщить родительскому курсу, что его больше нет вкорзина).

Вот мой код, использующий form_for:

 <%= form_for(line_item, :method => :delete, :remote => true) do |f| %>
<%= f.submit :value => "Delete" %>
<% end %>
  

В документации ruby говорится, что простое добавление:method =>:delete должно работать (http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for ), но отображаемый HTML-код не совсем правильный. Это все еще

 <input name="_method" type="hidden" value="put">
  

Но это должно быть:

 <input name="_method" type="hidden" value="delete">
  

Что я делаю не так?

Ответ №1:

У Марка Нидхэма есть сообщение в блоге, в котором рассказывается о том, почему :method => delete in form_for не работает. Он говорит

Оказывается, что ‘form_for’ ожидает, что ‘:method’ будет предоставлен как часть самого правого аргумента как часть хэша с ключом ‘:html’.

Итак, вам нужно изменить свой код с:

 <%= form_for(line_item, :method => :delete, :remote => true) do |f| %>
  

Для:

 <%= form_for(line_item, :html => { :method => :delete, :remote => true }) do |f| %>
  

Я попробовал это в приложении Rails 3.0, и сгенерированный HTML был:

 <input type="hidden" value="delete" name="_method">
  

Ответ №2:

Мой в HAML просто:

     = form_with url: destroy_user_session_path, method: :delete do |form|
      = form.submit "Sign out"