Каков наилучший способ добавления пользовательского маршрута к мелкому вложенному ресурсу?
Я использую камень act_as_votable, чтобы иметь возможность любить объекты из двух разных моделей.
Все работает как ожидалось в Rails Console.
У меня проблемы с возможностью создания маршрута, который мне нужен в контроллере, ресурсы которого вкладываются.
Файл маршрута в настоящее время выглядит следующим образом.
KitsIo::Application.routes.draw do
resources :kits do
get :like, :on => :member
resources :things, shallow: true
get :like, :on => :member
end
root 'kits#index'
end
Беговые рейк-маршруты:
like_kit_path GET /kits/:id/like(.:format) kits#like
kit_things_path GET /kits/:kit_id/things(.:format) things#index
POST /kits/:kit_id/things(.:format) things#create
new_kit_thing_path GET /kits/:kit_id/things/new(.:format) things#new
edit_thing_path GET /things/:id/edit(.:format) things#edit
thing_path GET /things/:id(.:format) things#show
PATCH /things/:id(.:format) things#update
PUT /things/:id(.:format) things#update
DELETE /things/:id(.:format) things#destroy
GET /kits/:id/like(.:format) kits#like
kits_path GET /kits(.:format) kits#index
POST /kits(.:format) kits#create
new_kit_path GET /kits/new(.:format) kits#new
edit_kit_path GET /kits/:id/edit(.:format) kits#edit
kit_path GET /kits/:id(.:format) kits#show
PATCH /kits/:id(.:format) kits#update
PUT /kits/:id(.:format) kits#update
DELETE /kits/:id(.:format) kits#destroy
root_path GET / kits#index
Маршрут к like_kit_path создан правильно, и я могу установить комплект из контроллера Kits.
Проблема, которую я пытаюсь решить, заключается в возможности создать like_things_path, который будет направлять к контроллеру вещей.
like_things_path GET /things/:id/like(.:format) такие вещи, как #
Если я изменю файл маршрута на это:
KitsIo::Application.routes.draw do
resources :kits do
get :like, :on => :member
resources :things do
get :like, :on => :member
end
end
root 'kits#index'
end
Затем маршрут создается правильно для контроллера вещей.
like_kit_path GET /kits/:id/like(.:format) kits#like
like_kit_thing_path GET /kits/:kit_id/things/:id/like(.:format) things#like
kit_things_path GET /kits/:kit_id/things(.:format) things#index
POST /kits/:kit_id/things(.:format) things#create
new_kit_thing_path GET /kits/:kit_id/things/new(.:format) things#new
edit_kit_thing_path GET /kits/:kit_id/things/:id/edit(.:format) things#edit
kit_thing_path GET /kits/:kit_id/things/:id(.:format) things#show
PATCH /kits/:kit_id/things/:id(.:format) things#update
PUT /kits/:kit_id/things/:id(.:format) things#update
DELETE /kits/:kit_id/things/:id(.:format) things#destroy
kits_path GET /kits(.:format) kits#index
POST /kits(.:format) kits#create
new_kit_path GET /kits/new(.:format) kits#new
edit_kit_path GET /kits/:id/edit(.:format) kits#edit
kit_path GET /kits/:id(.:format) kits#show
PATCH /kits/:id(.:format) kits#update
PUT /kits/:id(.:format) kits#update
DELETE /kits/:id(.:format) kits#destroy
root_path GET / kits#index
Есть ли другой способ создать собственный маршрут к контроллеру вещей, отличный от второго примера файла маршрута?
Хотя это создает правильный маршрут, он нарушает большую часть кода, который работает в данный момент.
Заранее благодарим за любую помощь, которую вы можете оказать, помогая мне решить эту проблему.
1 ответ
Что ж, очень тонкая ошибка, которую вы сделали при объявлении ваших маршрутов, заключается в том, что вы не предоставили блокировку ресурсу "вещи". Следовательно, как вы можете видеть в выводе, Rails создает два дублирующих пути для одного и того же действия в ваших маршрутах, которое kits_like_path
сопоставлены с kits#like
Как оба get :like, on: :member
применяются только на ресурсе "наборы". Так что просто для того, чтобы он работал, предоставьте блок, объявляя ресурс 'Things' следующим образом:
resources :kits do
get :like, :on => :member
resources :things, shallow: true do
get :like, :on => :member
end
end
Вывод команды rake router будет следующим:
like_kit GET /kits/:id/like(.:format) kits#like
like_thing GET /things/:id/like(.:format) things#like
kit_things GET /kits/:kit_id/things(.:format) things#index
POST /kits/:kit_id/things(.:format) things#create
new_kit_thing GET /kits/:kit_id/things/new(.:format) things#new
edit_thing GET /things/:id/edit(.:format) things#edit
thing GET /things/:id(.:format) things#show
PUT /things/:id(.:format) things#update
DELETE /things/:id(.:format) things#destroy
kits GET /kits(.:format) kits#index
POST /kits(.:format) kits#create
new_kit GET /kits/new(.:format) kits#new
edit_kit GET /kits/:id/edit(.:format) kits#edit
kit GET /kits/:id(.:format) kits#show
PUT /kits/:id(.:format) kits#update
DELETE /kits/:id(.:format) kits#destroy
Я надеюсь, что это поможет вам.