Маршрут Rails, основанный на чем-то отличном от ID

Итак, в настоящее время у меня есть что-то вроде /users/ 1/, когда я хочу просмотреть профиль пользователя. Dunno, насколько простой или простой вопрос, я немного Rails noob на данный момент, но как я могу пройти через route.rb, чтобы изменить это на/user/chiggins/где chiggins - уникальное имя пользователя?

Спасибо большое!

Ответ 1

Вам нужно переопределить метод to_param в модели пользователя:

class User
  def to_param
   username
  end
end

Затем рельсы будут автоматически использовать его для маршрутизации. См. http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param

Ответ 3

Вы можете настроить индивидуальный идентификатор ресурса, переопределив методы member_scope и nested_scope в экземпляре Resource.

resources :users do
  @scope[:scope_level_resource].tap do |u|
    def u.member_scope
      "#{path}/:username"
    end

    def u.nested_scope
      "#{path}/:#{singular}_username"
      # member_scope also usable here, assuming username will be nowhere in nested routes.
    end
  end
end

Что касается вопроса о #nested_scope ниже: он используется, когда вы делаете что-то подобное в маршрутизации:

resources :members do
  resources :playlists, only: :index
end

Тогда param будет: member_username вместо just: username. Это полезно в контроллере списков воспроизведения при сборке, чтобы вы могли указать объем запроса.

Ответ 5

Лучший способ - определить маршрут с настраиваемым параметром:

match "/users/:username" => "users#show"

В вашем контроллере простые старые параметры [: id] будут параметрами [: username], и ​​вы можете получить пользователя из БД, используя:

User.find_by_username(params[:username])