Подтвердить что ты не робот

Как переименовать параметр id id по умолчанию в Rails map.resources()?

Мне нравятся все маршруты по умолчанию, которые генерируются Rail map.resources. Но есть случаи, когда я хотел бы использовать нечисловой идентификатор в моих маршрутах. Например, если вложенный маршрут состоит из пользователей и их статей, стандартный маршрут может быть записан следующим образом:

map.resources :users, :has_many => [:articles] # => e.g. '/users/:id/articles/:id'

Однако есть много преимуществ/причин не использовать численный идентификатор по умолчанию, сгенерированный Rails. Есть ли способ заменить параметры по умолчанию: id другому каноническому идентификатору по моему выбору, не приводя к написанию пользовательских маршрутов для каждого стандартного действия? Скажите, хочу ли я маршрут в следующем формате:

'/users/:login/articles/:id'

Являются ли такие маршруты доступными, используя map.resources?

4b9b3361

Ответ 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!.

Ответ 2

Вы можете изменить значение по умолчанию, используя идентификатор в URL-адресах, переопределив to_param в своей модели. например.

class User < ActiveRecord::Base
  def to_param
    login
  end
end

user_articles_path(@user) => "/users/:login/articles"

Единственное другое изменение, которое вам нужно сделать, - это найти пользователей по имени пользователя, а не по идентификатору в ваших контроллерах.