Именование параметров вложенных маршрутов

resources :leagues do
  resources :schedule
end

Это генерирует:

leagues/:id
leagues/:league_id/schedule/:id

Как я могу предотвратить изменение имени параметра в идентификаторе лиги? Так будет:

leagues/:id
leagues/:id/schedule/:schedule_id

person Fred Fickleberry III    schedule 05.10.2011    source источник


Ответы (3)


Нет, пожалуйста, не делайте этого.

Причина этого в том, что он предоставляет общий интерфейс для вложенных ресурсов в каждом отдельном приложении. Делая его другим в своем приложении, вы фактически идете «против течения» Rails. В Rails есть строгий набор соглашений, которых вы должны придерживаться. Когда вы отклоняетесь от этого пути, все становится грязным.


Однако, если вы хотите, образно говоря, выстрелить себе в ногу, вам нужно будет определить маршруты вручную. Вот маршруты для семи стандартных действий в контроллере:

get 'leagues/:id/schedules', :to => "schedules#index", :as => "league_schedules"
get 'leagues/:id/schedule/:schedule_id', :to => "schedules#show", :as => "league_schedule"
get 'leagues/:id/schedules/new', :to => "schedules#new", :as => "new_league_schedule"
post 'leagues/:id/schedules', :to => "schedules#create"
get 'leagues/:id/schedule/:schedule_id/edit', :to => "schedules#edit", :as => "ed it_league_schedule"
put 'leagues/:id/schedule/:schedule_id', :to => "schedules#update"
delete 'leagues/:id/schedule/:schedule_id', :to => "schedules#destroy"

Как видите, довольно некрасиво. Но если вы действительно очень-очень хотите сделать это таким образом, вы должны сделать это именно так.

person Ryan Bigg    schedule 05.10.2011

Вы можете установить параметр «param» на маршруте ресурса, чтобы переопределить параметр «id» по умолчанию:

resources :leagues do
  resources :schedule, param: schedule_id
end

ссылки на документ Rails Routing: http://guides.rubyonrails.org/routing.html#overriding-named-route-parameters

person mios    schedule 28.11.2015
comment
Протестировал это с рельсами 4.2. Возможно, это сработало в прошлом, но я не могу заставить его работать снова. Удалось ли вам получить эту работу на более новых версиях рельсов? - person newdark-it; 06.07.2018

Он добавляет идентификатор к вложенному_параму, что является обломом, потому что я хотел бы, чтобы у меня не было имени в единственном числе. Похоже, они действительно не хотят, чтобы вы делали это только как :id, так как это может привести к конфликтам. Кроме того, это будет немного отличаться от обычной спокойной маршрутизации, которую любят использовать рельсы.

https://github.com/rails/rails/blob/5368f2508651c92fbae40cd679afbafdd7e98e77/actionpack/lib/action_dispatch/routing/mapper.rb#L1207

namespace :account, defaults: { type: 'account' }do
  resources :auth, param: :lies_id, only: [] do
    get :google
  end
end

Маршруты Rake возвращают следующее

$ rake routes | grep /account/auth
account_auth_google GET  /account/auth/:auth_lies_id/google(.:format)

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

person newdark-it    schedule 06.07.2018