2010-01-26 9 views
9

Quiero que los usuarios puedan tener una página de perfil en site.com/myNameHere. Rails busca un controlador llamado "myNameHere". ¿Es posible configurar routes.rb para que, si no se encuentra el controlador, se envíe "myNameHere" como parámetro a otro controlador?¿Cómo puedo implementar URL vanity en una aplicación de Rails?

+0

Solo asegúrate de que si eliges usar la vanidad, sabes que hay vulrenability en vanities_controller.rb en el redirect_to solo agrega: only_path => true y debes ser bueno – dennis

Respuesta

9

Usted puede agregar una ruta como esta:

map.profile_link '/:username', :controller => 'profiles', :action => 'show' 

Asegúrese de añadir que baja lo suficiente en el archivo, por debajo de sus recursos, que no interfiere con otras rutas. Debería ser la prioridad más baja. A continuación, usted tiene que cambiar su programa de acción para utilizar un nombre de usuario en lugar de Identificación:

def show 
    @user = User.find_by_username(params[:username]) 
end 

Eso es todo lo que hay que hacer. Feliz codificación!

ACTUALIZACIÓN:

he ampliado esta respuesta en una entrada de blog completo, Vanity URLs in Ruby on Rails Routes. Tengo muestras de código adicionales y una explicación más completa.

+0

Gracias, funcionó como un amuleto. – user258980

+2

Querrá tener en cuenta que una ruta de comodín en el nivel raíz atrapará lo que deberían ser errores 404 de nivel superior. Es decir. http://domain.com/askdjasd. Por lo tanto, probablemente desee agregar un control de excepciones (no encontrado) en su acción de mostrar y generar su error 404 en lugar de 500. –

+5

Sobre la base de lo que dijo Dave Rapin, puede usar 'rescue_from ActiveRecord :: RecordNotFound,: with =>: your_404_method' en su controlador para mostrar errores 404 automáticamente cuando no se encuentra un usuario. Deberá plantear ese error manualmente si está utilizando un método 'find_by_attribute' porque no los sube automáticamente. Así que use 'raise ActiveRecord :: RecordNotFound a menos que @user = User.find_by_username (params [: username])' y el rescate asociado y esté dorado. – coreyward

0

Solo pensé en actualizar esto para Rails 3. Tengo un campo 'sitio web' en mi modelo de usuario que va a actuar como la ruta de vanidad, y voy a dirigirme a una página estática para cada ruta de vanidad. Quiero mostrar todos los eventos de un usuario si se llama a la ruta de vanidad.

#config/routes.rb 
    get '/:website', :controller => 'static_pages', :action => 'vanity' 

#app/controllers/static_pages_controller.rb 
    def vanity 
     @user = User.find_by_website(params[:website]) 
    if @user != nil #in case someone puts in a bogus url I redirect to root 
     @events = @user.events 
    else 
     redirect_to :root 
    end 
    end 

#app/views/static_pages/vanity.html.erb 
<h1><%= @user.website %> events</h1> 

<table> 
    <tr> 
    <th>Title</th> 
    <th>Starts at</th> 
    <th>Description</th> 
    <th></th> 
    <th></th> 
    <th></th> 
    </tr> 

<% @events.each do |event| %> 
    <tr> 
    <td><%= event.title %></td> 
    <td><%= event.starts_at %></td> 
    <td><%= event.description %></td> 
    </tr> 
<% end %> 
</table> 

Creo que esta es una buena alternativa si no quieres usar una gema.

Cuestiones relacionadas