Каков наилучший способ добавления пользовательского маршрута к мелкому вложенному ресурсу?

Я использую камень 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

Я надеюсь, что это поможет вам.

Другие вопросы по тегам