Какова цель использования: method => delete in button_to? - PullRequest
0 голосов
/ 21 октября 2018

Насколько я понимаю, HTTP-глагол «DELETE» не поддерживается в HTML, и поэтому при создании форм удаления требуется другой маршрут.

Если это так, почему этот код работаетотлично,

<%=button_to 'Delete', {:controller => :users, :action => 'destroy', :id => user.id}, :method => :delete%>

, но следующий код не работает

<%=button_to 'Delete', {:controller => :users, :action => 'destroy', :id => user.id}%>

и выдает ошибку: 'No route matches [POST] "users/1/"'

не должен ли URL разрешаться как users/destroy/1?

Ответы [ 4 ]

0 голосов
/ 21 октября 2018

Старые версии HTML поддерживают только GET и POST.Более новая версия включает PUT, PATCH и DELETE, которые обрабатываются как XHR(XMLHttpRequest) запросы или просто AJAX запросы всеми основными веб-браузерами.

Когда запросы на PUTили PATCH или DELETE сделаны, Rails под капотом, с помощью Javascript обрабатывает эти запросы как XHR запросы к клиенту.Когда Javascript в вашем приложении не работает или отключен, эти запросы будут возвращаться к GET

Теперь возвращаемся к вашему фрагменту кода, который не работает.У вас есть следующее

<%= button_to 'Delete', {:controller => :users, :action => 'destroy', :id => user.id}%>

button_to по умолчанию создает форму и отправляет запрос как POST, если только вы явно не переопределяете его, как вы делаете впервый случай с :method => :delete.Таким образом, приведенный выше фрагмент кода генерирует URL-адрес, подобный users/1/, но в виде POST, который в конечном итоге дает сбой, поскольку у вас нет такого маршрута , определенного в routes.rb

Разве URL-адрес, который он разрешает считать пользователями / уничтожить / 1?

Нет, когда вы используете :method => :delete в своем коде, сгенерированный URL-адрес будет users/1, нозапрос отправляется как DELETE, который в конечном итоге работает как действительный запрос в соответствии с вашими маршрутами , которые определены в routes.rb

0 голосов
/ 21 октября 2018

По соглашению rails следует упоминать метод (глагол HTTP) со ссылкой, чтобы Rails знал, какой метод контроллера вызывать, потому что без действия глагола HTTP 3 показывать, обновлять и уничтожать все эти 3 генерируют один и тот же URLпуть "/users/:id" (если контроллером является «UsersController»).Для дальнейшего чтения я предлагаю взглянуть на:

https://guides.rubyonrails.org/routing.html#crud-verbs-and-actions

РЕДАКТИРОВАТЬ:

Как вы можете видеть на скриншоте, если установить HTTP-глагол наУДАЛИТЬ, Rails автоматически узнает, что ему нужно выполнить действие уничтожения, в противном случае путь для показа, обновления и уничтожения будет таким же.

enter image description here

0 голосов
/ 21 октября 2018

Putting: method =>: удалить сигналы Rails для создания формы со скрытыми значениями, которые затем будут использоваться для эмуляции функции формы с

method="delete"

Если кто-тобыть в состоянии объяснить, почему удаление :action => :destroy заставляет :id => user.id рассматриваться как ключ и значение в URL (то есть users?id=1 вместо users/1), я был бы благодарен.

0 голосов
/ 21 октября 2018

Звучит так, будто вам не нужен кодовый ответ, поскольку у вас уже есть рабочая версия.Rails делает кучу вещей за кулисами, поэтому может быть трудно узнать, что именно происходит в браузере, если вы не осмотрите его.

DELETE может не работать как свойство в теге HTML <form>, но это все еще допустимый HTTP-запрос.

Доступны ли методы PUT, DELETE, HEAD и т. Д. В большинстве веб-браузеров?

Чем полезны методы HTTP-запроса PUT и DELETE?

...