2008-10-23 7 views
5

Así que tengo una ruta personalizada elegante para inicio de sesiónconseguir renders para reconocer trayectorias de encargo de enrutamiento

# routes.rb 
map.login '/login', :controller => 'sessions', :action => 'new' 

Visita www.asite.com/login y ya está. Sin embargo, como es costumbre con el inicio de sesión fallido, haremos lo siguiente en nuestra acción. Tenga en cuenta lo que sucede en el inicio de sesión fallido.

# 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 

Esto es muy típico. Simplemente represente la nueva acción y solicite el inicio de sesión nuevamente. Desafortunadamente también obtienes una URL fea: www.asite.com/session. Ick! ¿Es posible que la representación respete la URL original?

+1

Pobre ejemplo. Considere las situaciones en las que desea conservar el texto que el usuario ya ha rellenado en el formulario. Render hace esto (ya que el objeto está parcialmente construido). Redirigir pierde el estado. –

Respuesta

0

Cambio render :action => 'new'-redirect_to login_path

7

Su problema es el siguiente: el usuario visita por primera /login y rellena el formulario. Cuando envían el formulario, POSTAN al /sessions, por lo que cambia la URL del navegador. Para evitar esto se puede hacer dos cosas:

Como Michael se menciona, puede redirigir de nuevo al: nueva acción, el cambio de la persona para:

else 
    flash[:warning] = "The email and/or password you entered is invalid." 
    redirect_to login_path 
end 

Tenga en cuenta que tendrá que cambiar el flash entonces el mensaje está disponible en la próxima solicitud (siguiendo el redireccionamiento).

El segundo método es un poco más hackier, pero tal vez valga la pena mencionarlo. Al usar condiciones en sus rutas, puede asignar tanto el formulario de inicio de sesión (que es un GET) como el formulario enviado (que es un mensaje POST) a la misma ruta. Algo así como:

map.login '/login', 
    :controller => 'sessions', :action => 'new', 
    :conditions => {:method => :get} 

map.login_submit '/login', 
    :controller => 'sessions', :action => 'create', 
    :conditions => {:method => :post} 

Luego, si su acción de formulario es iniciar sesión, envíe la ruta, las cosas deberían funcionar como espera.