Ottenere rendering per riconoscere percorsi di routing personalizzati
-
04-07-2019 - |
Domanda
Quindi ho un percorso personalizzato elegante per il login
# routes.rb
map.login '/login', :controller => 'sessions', :action => 'new'
Visita www.asite.com/login e sei lì. Come è personalizzato con login non riuscito, tuttavia, nella nostra azione faremo quanto segue. Nota cosa succede al login fallito.
# sessions_controller.rb
def create
self.current_user = User.authenticate(params[:email], params[:password])
if logged_in?
# some work and redirect the user
else
flash.now[:warning] = "The email and/or password you entered is invalid."
render :action => 'new'
end
end
Questo è molto tipico. Basta eseguire il rendering della nuova azione e richiedere nuovamente l'accesso. Purtroppo hai anche un brutto URL: www.asite.com/session. Ick! È possibile ottenere il rendering per rispettare l'URL originale?
Nessuna soluzione corretta
Altri suggerimenti
Il tuo problema è questo: l'utente prima visita / login
e compila il modulo. Quando inviano il modulo, POST in / sessioni
, motivo per cui l'URL del browser cambia. Per aggirare questo, puoi fare due cose:
Come menzionato da Michael, puoi reindirizzare a: nuova azione, cambiando il resto in:
else
flash[:warning] = "The email and/or password you entered is invalid."
redirect_to login_path
end
Nota che dovrai cambiare il flash in modo che il messaggio sia disponibile nella prossima richiesta (dopo il reindirizzamento).
Il secondo metodo è leggermente più hacker, ma forse vale la pena menzionarlo. Utilizzando le condizioni sui percorsi, è possibile mappare sia il modulo di accesso (che è un OTTENERE) sia l'invio del modulo (che è un POST) sullo stesso percorso. Qualcosa del tipo:
map.login '/login',
:controller => 'sessions', :action => 'new',
:conditions => {:method => :get}
map.login_submit '/login',
:controller => 'sessions', :action => 'create',
:conditions => {:method => :post}
Quindi, se l'azione del modulo è il percorso di invio del login, le cose dovrebbero funzionare come previsto.
Cambia render: action = > 'new'
in redirect_to login_path