2011-10-12 14 views
19

Sto provando a cambiare i percorsi dei binari da/users/1 a/username. Al momento l'ho impostato in modo che funzioni per le azioni di visualizzazione e modifica. Il problema reale è che quando vado per aggiornare l'utente utilizzando:Rails route to username invece di id

<%= form_for @user do |f|%> 

Non è mai aggiornamenti, perché l'azione di aggiornamento è indirizzato a/utenti /: id. C'è un modo per instradare questo in modo che funzioni per/username? (che è la rotta che viene resa nei miei moduli come azione). Mi sono grattato la testa su questo per un po 'di tempo.

EDIT:

Il problema non è di routing per nome utente, che funziona correttamente. Il problema è che il modulo indirizza a/nome utente per l'aggiornamento, tuttavia il percorso di aggiornamento per gli utenti è ancora/utenti /: id invece di:/id.

ho provato ad aggiornare i miei percorsi da questo, ma senza successo:

match '/:id', :to => "users#show", :as => :user 
match '/:id', :to => "users#update", :as => :user, :via => :put 
match '/:id', :to => "users#destroy", :as => :user, :via => :delete 

EDIT:

Doh! Questo risolto il problema:

match '/:id', :to => "users#show", :as => :user, :via => :get 

risposta

32

nel modello utente:

def to_param 
    username 
end 

Il metodo to_param su ActiveRecord oggetti usi, per impostazione predefinita, solo l'ID dell'oggetto. Inserendo questo codice nel modello, si sovrascrive il valore predefinito di ActiveRecord, quindi quando si collega a un utente, verrà utilizzato lo username per il parametro anziché id.

17

Nel modello Utente sovrascrivere il metodo to_param per restituire ciò che si desidera utilizzare nell'URL.

class User < ActiveRecord::Base 
    def to_param 
    username 
    end 
end 

Nel vostro controller invece di usare User.find(params[:id]) è ora necessario utilizzare User.find_by_username(params[:id])

+1

sarebbe meglio specificare 'param:: username' in percorsi f ile? Perché il param non dovrebbe più essere chiamato ': id', ma dovrebbe invece essere chiamato': username' –

0

Non è necessario eseguire l'override to_param se non si vuole, si può solo specificare nel tag form come questo :

<%= form_for @user, :url => user_path(:id => @user.username) do |f|%>