2010-01-26 11 views
9

Desidero che gli utenti siano in grado di avere una pagina profilo su site.com/myNameHere. Rails cerca un controller chiamato "myNameHere". È possibile impostare routes.rb in modo che se il controller non viene trovato, "myNameHere" viene inviato come parametro a un altro controller?Come posso implementare gli URL vanity in un'applicazione Rails?

+0

Basta fare in modo che se si sceglie di utilizzare la gemma vanità si sa che c'è un vulrenability nel vanities_controller.rb nel redirect_to basta aggiungere: only_path => true e si dovrebbe essere buono – dennis

risposta

9

è possibile aggiungere un percorso come questo:

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

assicurarsi di aggiungere che abbastanza basso nel file, sotto le risorse, che non interferisce con altre vie. Dovrebbe essere la priorità più bassa. Successivamente, è necessario cambiare la vostra azione show di usare un nome utente al posto di id:

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

Questo è tutto ciò che devi fare. Buona programmazione!

UPDATE:

Ho ampliato questa risposta in un post sul blog pieno, Vanity URLs in Ruby on Rails Routes. Ho esempi di codice aggiuntivi e una spiegazione più approfondita.

+0

Grazie, ha funzionato come un fascino. – user258980

+2

Ti consigliamo di tenere presente che un percorso con caratteri jolly a livello di radice intercetterà quelli che dovrebbero essere errori di livello superiore 404. Cioè http://domain.com/askdjasd. Quindi probabilmente vorrai aggiungere una gestione delle eccezioni (non trovata) nella tua azione show e rendere il tuo 404 invece di un errore 500. –

+5

Sulla base di ciò che Dave Rapin ha detto, puoi usare 'rescue_from ActiveRecord :: RecordNotFound,: with =>: your_404_method' nel tuo controller per mostrare automaticamente gli errori 404 quando nessun utente viene trovato. Dovrai innalzarlo manualmente se stai usando un metodo 'find_by_attribute' perché non li alza automaticamente. Quindi usa 'raise ActiveRecord :: RecordNotFound a meno che @user = User.find_by_username (params [: username])' e il salvataggio associato e tu sia d'oro. – coreyward

0

Ho appena pensato di aggiornare questo per Rails 3. Ho un campo 'sito web' nel mio modello utente che fungerà da vanity route, e ho intenzione di indirizzare a una pagina statica per ogni vanity route. Voglio visualizzare tutti gli "eventi" di un utente se viene chiamato il percorso di vanità.

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

Penso che questa sia una buona alternativa se non si desidera utilizzare una gemma.