Esto se conoce comúnmente como una URL de vanidad, y con un poco de precaución que puede manejar esto con bastante facilidad. En primer lugar ...
- asegurarse de que esta es la última cosa en sus rutas. No desea que sus nombres de usuario anulen el espacio de nombres de otro controlador.
- Utilice una lista de exclusión razonable para evitar que los usuarios tengan nombres de usuario como administrador, soporte, oficial, seguro, etc.
En sus rutas:
# 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
En el código anterior, que evitan la duplicación de la opción :constrain
para cada ruta para mayor claridad. Deberá ajustar la expresión regular para que coincida con sus nombres de usuario, y luego asegúrese de tenerla en la ruta que elija.
Si esta va a ser la forma predeterminada de acceder a usuarios desde su aplicación (es decir, no solo una forma conveniente de acceder al perfil de un usuario), querrá anular el método to_param
en su modelo de Usuarios. Esto le permite usar los ayudantes url_for
como form_for @user
sin especificar argumentos adicionales.
class User
def to_param
username
end
end
Otro consejo rápido: si estás jugando con sus rutas y tratando de hacer nada más que lo básico, asegúrese de llamar $ rake routes
frecuencia de la línea de comandos para ver qué rutas Carriles reconoce actualmente. También es bueno que limpies los que no necesitas. ;)
Ya es parece reemplazar id (300) con el nombre de ** ** Harry sino que también dio error decir que no se encontró registro con id harry.I han pegado "conseguir '/: nombre de usuario' => 'usuarios # show' ,: constrain => {: username =>/[a-zA-Z -] + /} "al final del archivo de ruta y agregado a_parametros a mi modelo de usuario ¿Me estoy perdiendo algo o he hecho algo mal? – Gagan
@Gagan Aún necesita actualizar sus métodos de controlador para encontrar al usuario desde el parámetro de nombre de usuario. El valor predeterminado es algo así como 'User.find (params [: id])' que espera identificadores numéricos de clave primaria. En su lugar, quiere algo como 'User.find_by_username (params [: username])'. – coreyward