#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.
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)
Итак, решение, которое проще, — просто изменить контроллер, чтобы использовать имя вложенного параметра, которое он создает.