Это обычно называют тщеславным URL, и с небольшой осторожностью вы можете справиться с этим довольно легко.Первый ...
- Убедитесь, что это последнее, что есть на ваших маршрутах.Вы не хотите, чтобы ваши имена пользователей перекрывали пространство имен другого контроллера.
- Используйте разумный список исключений, чтобы запретить пользователям иметь такие имена пользователей, как admin, support, official, secure и т. Д.
Inваши маршруты:
# the simple case
get '/:username' => 'users#show', :constrain => { :username => /[a-zA-Z-]+/ }
# ...with vanity_url_path(@user) helpers
get '/:username' => 'users#show', :as => 'vanity_url'
# or routing something more complicated with all the default resourceful routes
resources :users, :path => '/:username'
# or even just defining a bunch of routes for users with this format
controller :users, :path => '/:username' do
get '/profile', :action => :profile #=> /johnsmith/profile => UsersController#profile
end
В приведенном выше коде я избежал дублирования параметра :constrain
для каждого маршрута для ясности.Вы захотите настроить регулярное выражение так, чтобы оно совпадало с вашими именами пользователей, а затем убедитесь, что оно есть у вас на любом маршруте.
Если это будет стандартный способ доступа к пользователям из вашего приложения (т. Е. Не просто удобный способ доступа к профилю пользователя), вы можете переопределить метод to_param
длямодель ваших пользователей.Это позволяет использовать помощники url_for
, например form_for @user
, без указания дополнительных аргументов.
class User
def to_param
username
end
end
Еще один быстрый совет: если вы играете со своими маршрутами и пытаетесь сделать что-то большее, чем просто основы, не забывайте часто вызывать $ rake routes
из командной строки, чтобы увидеть, какие маршруты в настоящее время распознает Rails.,Очистить те, которые вам не нужны, тоже хорошо.;)