Это обычно называют тщеславным URL-адресом, и с небольшой осторожностью вы можете справиться с этим довольно легко. Первый...
- Убедитесь, что это последняя вещь в ваших маршрутах. Вы не хотите, чтобы ваши имена пользователей переопределяли пространство имен другого контроллера.
- Используйте разумный список исключений, чтобы запретить пользователям использовать такие имена пользователей, как admin, support, Official, Secure и т. д.
В ваших маршрутах:
# 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
в своей модели Users. Это позволяет вам использовать помощники url_for
, такие как form_for @user
, без указания дополнительных аргументов.
class User
def to_param
username
end
end
Еще один небольшой совет: если вы играете со своими маршрутами и пытаетесь сделать что-то большее, чем основы, не забудьте часто вызывать $ rake routes
из командной строки, чтобы увидеть, какие маршруты в настоящее время распознает Rails. Очистить те, которые вам не нужны, тоже полезно. ;)
person
coreyward
schedule
27.02.2011