Начиная с Rails 2.3, невозможно изменить имя параметра и по-прежнему использовать автоматическую маршрутизацию, которую предоставляет #resources
.
В качестве временного решения можно сопоставить articles
с :path_prefix
и :name_prefix
:
map.resources :articles, :path_prefix => "https://stackoverflow.com/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"}
Как общее правило, из пальца, хотя, я бы придерживаться по умолчанию конвенции рельсам :user_id
с маршрутизацией вы вывесили в вашем вопросе. Как правило, понятно, что :id
и :user_id
необязательно подразумевают «числовой идентификатор» - они подразумевают «идентификатор ресурса», что бы это ни было. И, придерживаясь соглашения по умолчанию, ваш код будет легче понять для тех, кто использовал маршруты ресурсов в Rails.
Чтобы использовать нечисловой идентификатор ресурса, просто переопределите #to_param
в вашей модели. Затем убедитесь, что вы используете искатель в своем контроллере, который найдет этот идентификатор (а не числовой идентификатор), например User#find_by_login!
.
p.s. Я прошу об этом, главным образом потому, что система маршрутизации Merb имеет такую возможность. – newtonapple