#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"