Rails делает некоторые ресурсы маршрутов единичными, а некоторые - множественными. - PullRequest
1 голос
/ 13 февраля 2020

Мне нужно получить следующие пути:

PUT        /group(.:format)         api/v1/groups#update {:format=>:json}
DELETE     /group(.:format)         api/v1/groups#destroy {:format=>:json}
GET        /groups(.:format)        api/v1/groups#index {:format=>:json}
GET        /groups/:id(.:format)    api/v1/groups#show {:format=>:json}

Как вы видите, мне нужно, чтобы PUT и DELETE были равны group (без идентификатора), но индекс и показ должны быть groups путь.

Я пробовал это на моем routes.rb:

resource :group, only: %i[update destroy]
resources :groups, only: %i[show index]

И, похоже, он создает нужные маршруты:

api_group PATCH      /group(.:format)          api/v1/groups#update {:format=>:json}
           PUT        /group(.:format)         api/v1/groups#update {:format=>:json}
           DELETE     /group(.:format)         api/v1/groups#destroy {:format=>:json}
api_groups GET        /groups(.:format)        api/v1/groups#index {:format=>:json}
           GET        /groups/:id(.:format)    api/v1/groups#show {:format=>:json}

Но потом, когда я запускаю тесты например, для шоу я получаю:

Failure/Error: get api_group_path(group.id), headers: auth_headers, as: :json

ActionController::RoutingError:
  No route matches [GET] "/group.86d95177-9b44-4b5b-8ff7-98b609614c50"

Так что, держу пари, они должны переопределять друг друга, потому что либо работает шоу и индекс, либо происходит удаление и вставка.

Может кто-нибудь мне помочь? Спасибо

1 Ответ

1 голос
/ 13 февраля 2020

В соответствии с вашими маршрутами для запроса GET вы должны позвонить:

api_v1_groups_path(group_id) #for SHOW method
api_v1_groups_path           #for INDEX method

Для запросов PATCH и DELETE вам необходимо позвонить:

api_v1_group_path

РЕДАКТИРОВАНИЕ: Да, я проверил в песочнице маршруты немного испорчены, я предлагаю заменить ваши текущие маршруты генерацией пользовательских маршрутов, например так:

namespace :api do
  put "/group",      to: "groups#update",  as: 'update_group'
  delete "/group",   to: "groups#destroy", as: 'destroy_group'
  get "/groups",     to: "groups#index",   as: 'index_groups'
  get "/groups/:id", to: "groups#show",    as: 'show_group'
end

он генерирует те же маршруты, что и у вас:

api_update_group   PUT    /api/group(.:format)                                                                     api/groups#update
api_destroy_group DELETE  /api/group(.:format)                                                                     api/groups#destroy
api_index_groups   GET    /api/groups(.:format)                                                                    api/groups#index
api_show_group     GET    /api/groups/:id(.:format)                                                                api/groups#show

Это должно работать. Я надеюсь, что это поможет вам немного

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...