Наименование параметров вложенных маршрутов - PullRequest
3 голосов
/ 05 октября 2011
resources :leagues do
  resources :schedule
end

Создает:

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

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

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

Ответы [ 3 ]

9 голосов
/ 06 октября 2011

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

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

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

1 голос
/ 28 ноября 2015

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

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

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

0 голосов
/ 06 июля 2018

Это добавляет идентификатор к 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-маршруты возвращают следующее

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

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

...