Маршрут 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
Ответ 2
Еще одна возможность для рассмотрения - это атрибут friendly_id - https://github.com/norman/friendly_id
Ответ 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. Это полезно в контроллере списков воспроизведения при сборке, чтобы вы могли указать объем запроса.
Ответ 4
В настоящее время в объявлении ресурса есть аргумент :param
.
http://guides.rubyonrails.org/routing.html#overriding-named-route-parameters
Ответ 5
Лучший способ - определить маршрут с настраиваемым параметром:
match "/users/:username" => "users#show"
В вашем контроллере простые старые параметры [: id] будут параметрами [: username], и вы можете получить пользователя из БД, используя:
User.find_by_username(params[:username])