2011-10-13 9 views
10

Por lo tanto, actualmente tengo algo como/users/1/cuando quiero ver un perfil de usuario. No sé qué fácil o común es una pregunta, soy un poco novato de Rails en este momento, pero ¿cómo puedo pasar por routes.rb para cambiar eso a/user/chiggins/donde chiggins es un nombre de usuario único?Rutas Ruta basada en algo diferente a la ID

¡Muchas gracias!

Respuesta

13

lo que necesita es anular to_param método en el modelo de usuario:

class User 
    def to_param 
    username 
    end 
end 

Entonces rieles utilizarán automágicamente para el enrutamiento. Ver http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param

+0

bien, lo que añade poco, pero estoy recibiendo el siguiente error: http://chigstuff.com/uploads/user_error.jpg – Chiggins

+0

No importa, me encontré con mi problema. Mi método de show estaba haciendo "@user = User.find (: params [: id])", lo cambié para buscar por el nombre de usuario. – Chiggins

+0

Cambie el código en su controlador: no User.find (params [: id]) pero User.find_first_by_username (params [: id]) o cambie el cuerpo de to_param a "# {self.id} - # {self.username}" –

0

La mejor manera es definir una ruta con un parámetro personalizado:

match "https://stackoverflow.com/users/:username" => "users#show" 

En su controlador, los viejos parametros de civil [: id] será params [: nombre de usuario], y se puede obtener el usuario de base de datos usando:

User.find_by_username(params[:username]) 
+0

Acabo de agregar esa primera línea a mis routes.db, aunque en lugar de usar: nombre de usuario Todavía estoy obligado a usar: id – Chiggins

1

Usted puede obtener por los recursos identificador cu sofisticación redefiniendo los métodos member_scope y nested_scope en la instancia de 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 

En cuanto a la pregunta sobre #nested_scope a continuación: Se acostumbra cuando se hace algo como esto en el enrutamiento:

resources :members do 
    resources :playlists, only: :index 
end 

A continuación, el parámetro sería: member_username en lugar de simplemente: nombre de usuario. Esto es útil en el controlador de listas de reproducción al ensamblar la colección para que pueda inferir el alcance de la solicitud.

+0

Entiendo "# {ruta} /: nombre de usuario", para sobreponer las rutas generadas automáticamente, pero no no entiendo qué significa el método "nested_scope" ?! – Matrix

+0

Ver la respuesta actualizada @Matrix. – 20man

Cuestiones relacionadas