2011-02-27 14 views

Respuesta

14

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 ...

  1. 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.
  2. 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. ;)

+0

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

+0

@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

0

intentar algo como esto en routes.rb

map.user_permalink 'users/:user_name', :controller => 'users', :action => 'show' 

más adelante en vistas utilizan de esta manera:

<%= link_to user.name, user_permalink_path(user.user_name.parameterize) %> 

No estoy seguro de si el código funcionará simplemente pégalo, pero obtienes el punto :)

4

Si quieres tener /: nombre de usuario, intenta esto en tus rutas.rb archivo (¡ESTA DEBE SER LA ÚLTIMA LÍNEA DEL BLOQUE! - Última ruta creada)

match "/:id", :to => "users#show", :as => :friendly_user 

Entonces, sólo para que sea menos horrible, puede utilizar the make_permalink gem para crear URL amigable nombres con facilidad y reemplazar el método to_param en su modelo

# models/user.rb 
make_permalink :username  

def to_param 
    permalink 
end 

Y a! que sea aún mejor, reemplazar el método User.find para trabajar por enlace permanente o por id

def self.find(query) 
    self.find_by_username(query) || super(query) 
end 

que funcione para User.find (1) o User.find (my_username).

Espero que ayude,

Nicolás Hock Isaza

Cuestiones relacionadas