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?
risposta
è 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.
Grazie, ha funzionato come un fascino. – user258980
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. –
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
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.
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