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

#ruby-on-rails-3 #routes #nested-routes

#ruby-on-rails-3 #маршруты #вложенные маршруты

Вопрос:

 resources :leagues do
  resources :schedule
end
  

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

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

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

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

Ответ №1:

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

Причина этого заключается в том, что он предоставляет общий интерфейс для вложенных ресурсов в каждом отдельном приложении. Изменяя его в своем приложении, вы фактически идете «против зерна» 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"
  

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

Ответ №2:

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

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

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

Комментарии:

1. Протестировал это с rails 4.2. Возможно, это работало в прошлом, но, похоже, я не могу заставить его работать снова. Вам повезло с этой работой в более новых версиях rails?

Ответ №3:

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

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 routes возвращает следующее

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

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