Ответ 1
Как и в случае с Rails 2.3, невозможно изменить имя параметра и использовать автоматическую маршрутизацию, предоставляемую #resources
.
В качестве обходного пути вы можете сопоставить articles
с :path_prefix
и :name_prefix
:
map.resources :articles, :path_prefix => "/users/:login",
:name_prefix => "user_"
:path_prefix
влияет на URL-адрес, а :name_prefix
влияет на сгенерированные именованные маршруты, поэтому вы получите следующие маршруты:
user_articles GET /users/:login/articles(.:format) {:controller=>"articles", :action=>"index"}
POST /users/:login/articles(.:format) {:controller=>"articles", :action=>"create"}
new_user_article GET /users/:login/articles/new(.:format) {:controller=>"articles", :action=>"new"}
edit_user_article GET /users/:login/articles/:id/edit(.:format) {:controller=>"articles", :action=>"edit"}
user_article GET /users/:login/articles/:id(.:format) {:controller=>"articles", :action=>"show"}
PUT /users/:login/articles/:id(.:format) {:controller=>"articles", :action=>"update"}
DELETE /users/:login/articles/:id(.:format) {:controller=>"articles", :action=>"destroy"}
Как правило, я придерживаюсь стандартного соглашения Rails по умолчанию :user_id
с маршрутизацией, опубликованной в вашем вопросе. В целом понималось, что :id
и :user_id
необязательно подразумевают "числовой идентификатор" - они подразумевают "идентификатор ресурса", что бы это ни было. И, придерживаясь соглашения по умолчанию, ваш код будет легче понять для всех, кто использовал маршруты ресурсов в Rails.
Чтобы использовать нечисловой идентификатор ресурса, просто переопределите #to_param
в своей модели. Затем убедитесь, что вы используете искатель в контроллере, который найдет этот идентификатор (а не числовой идентификатор), например User#find_by_login!
.