установить метод для PUT в XML-запросах Rails
-
12-09-2019 - |
Вопрос
если я сделаю это:
curl -X POST -H 'Content-type: application/xml' -d '<person>...</person>' 'http://0.0.0.0:3000/people/12?_method=PUT'
Я получаю «только получить, положить и удалять запросы». Почему?Рельсы 2.3.2
Решение 2
На самом деле это неисправность в последних версиях рельсов.Решение состоит в том, чтобы передать заголовок переопределения метода HTTP с помощью put.Важно: полное имя заголовка — http-x-http-method-override, но Rails добавляет префикс http, поэтому вам следует обрезать эту часть.
Другие советы
Лука прав, вам нужно отправить заголовок X-Http-Method-Override вместе с вашим запросом.Добавление _method=put в тело JSON у меня не сработало.Ваша командная строка Curl будет выглядеть так:
curl
-H "X-Http-Method-Override: put"
-H "Content-Type: application/json"
-d "{\"user\":{\"email\":\"blah@example.com\"}}"
www.site.com/users/username.json
Есть пара вещей, которые могут пойти не так.
Прежде всего, вы отправляете POST
с curl
, но у тебя есть "волшебство" _method
параметр вашего URL-адреса, и для него установлено значение PUT
.Судя по ошибке, похоже, что Rails принимает POST
как авторитетный тип запроса.Попробуйте без этого и посмотрите, что произойдет.
При более прозаичной ошибке маршрутизация (в config/routes.rb
можно настроить так, чтобы не разрешать POST
запросы на действие, которое вы пытаетесь использовать.
Если вы используете стандартный контроллер RESTful, это имеет смысл, поскольку вы получаете доступ к члену (/people/12
), что по умолчанию позволяет только GET
, PUT
, и DELETE
.
Я бы попробовал использовать curl -X PUT
и отбросив ?_method=PUT
из вашего запроса.