Выполнение PUT для одного URL/ метода из моего JS-клиента, другой - попадание

Я пытаюсь создать конечную точку API, которая использует несколько моделей, которые я называю Elements

Звонок идет в 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
Другие вопросы по тегам