Выполнение PUT для одного URL/ метода из моего JS-клиента, другой - попадание
Я пытаюсь создать конечную точку API, которая использует несколько моделей, которые я называю Element
s
Звонок идет в Api::V1::ElementsController
к Foo
метод.
scope module: :api, as: :api do
namespace :v1 do
resources :users, only: [:show, :update] do
resources :elements
put 'elements/element_update_multiple', to: 'elements#foo'
От rake routes
api_v1_user_elements_element_update_multiple PUT /v1/users/:user_id/elements/element_update_multiple(.:format) api/v1/elements#foo
Однако по какой-то причине, когда я делаю PUT на этот маршрут от моего клиента, я получаю следующую ошибку в моем терминале
Запущен PUT "/v1/users/5/elements/element_update_multiple" для 10.0.2.2 в 2017-07-27 17:16:00 +0000 Невозможно отобразить консоль из 10.0.2.2! Разрешенные сети: 127.0.0.1,::1, 127.0.0.0/127.255.255.255 ActiveRecord:: Загрузка схемы (0,4 мс). ВЫБЕРИТЕ "schema_migrations".* FROM "schema_migrations" Обработка Api::V1::ElementsController# обновиться как JSON
Это падает в update
метод, а не foo
метод. Есть идеи, почему это происходит? Спасибо!
2 ответа
Это из-за порядка маршрутов в вашем файле маршрутов. Вам нужно переключить их так:
put 'elements/element_update_multiple', to: 'elements#foo'
resources :elements
routes.rb
файлы чувствительны к порядку, поэтому, если Rails находит соответствующий маршрут до того, как он попадает на ваш пользовательский маршрут PUT (в этом случае он находит метод обновления в ваших маршрутах ресурсов), он сначала это сделает и никогда не доберется до вашего пользовательского маршрута PUT.
Чтобы добавить маршруты к resources
попробуйте добавить маршруты сбора следующим образом:
scope module: :api, as: :api do
namespace :v1 do
resources :users, only: [:show, :update] do
resources :elements do
collection do
put 'element_update_multiple', to: 'elements#foo'
end
end