2010-05-07 6 views
5

Si estoy en un alias de ruta como/register y tengo un error de formulario y lo renderizo: nuevo, ¿es posible que la ruta sea/se registre?redirigir a un alias de ruta en un error de validación de formulario

En estos momentos se está prestando/nueva

que podía hacer un register_path redirect_to pero entonces perdería los parametros?

Se trata de hacer la siguiente prueba fallan:

Scenario: Try registering with a bad staff number 
Given I am on the registration page 
When I fill in "email" with "[email protected]" 
And I fill in "First Name" with "Kevin" 
And I fill in "last name" with "Monk" 
And I fill in "Employee Number" with "something barking123" 
And I press "Register" 
Then I should be on the registration page 
And I should see "Your employee ID number looks incorrect." 
+1

le pregunté a un semejante pregunta y obtuve una respuesta, vea http: // stackoverflow.com/questions/1083798/use-custom-route-upon-model-validation-failure –

+0

Por amor a Jobs, corrija la gramática en la última oración. No desea que su sitio web aparezca en Error'd. "Su número de identificación de empleado parece incorrecto". – mcandre

+0

¡Oh sí! buen punto. ¡Tu derecho! –

Respuesta

1

Una alternativa sería configurar dos rutas de "registro". Una que solo acepta solicitudes GET (y va a la: acción nueva) y la otra que acepta solo solicitudes POST (y va a la acción de creación, pero representa la misma plantilla que para la nueva).

Esto podría ser:

map.get_register 'register', :controller => :registrations, 
       :action => :new, :conditions => { :method => :get } 
map.post_register 'register', :controller => :registrations, 
       :action => :create, :conditions => { :method => :post } 

Luego, en su controlador:

def new 
    @registration = Registration.new 
    # renders the 'registrations/new' template 
end 
def create 
    @registration = Registration.new(params[:registration]) 

    # render the 'registrations/new' template if we fail validation 
    return render(:action => :new) unless @registration.save 
    # otherwise renders the "create" template which is likely a thank-you 
end 

Parece que hay más de un modo similar en esta pregunta: ¿ Use custom route upon model validation failure

+0

Hola Taryn, Eso es exactamente lo que hice al final. Gracias por su respuesta. Kevin. –

1

Los Carriles manera es hacer que el "nuevo" (es decir, registro) acción de nuevo, ya que se ha creado el objeto, la forma contendrá los valores introducidos anteriormente así como también mensajes de error. Si redirige, debería guardar el objeto en la sesión o en la base de datos antes de hacer la redirección. Al apartarse de las convenciones, siempre es bueno asegurarse de que lo haga por una buena razón.

1

Llamar a renderizar desde una acción significará que la URL permanecerá sin cambios desde lo que fue GET o POST. El motivo por el que la URL es/new es porque 'Register' debe ser POST'ing to/new. Si desea que esta característica pase, debe cambiar "Entonces debería estar en la página de registro" para que sea "Entonces debería estar en la nueva página de registro" y escribir el paso web correspondiente, en mi opinión.

0

Si realmente quiere esto, puede combinar su acción 'crear' en su 'nueva' acción, y su acción 'actualizar' en su acción 'editar'. Entonces necesitaría verificar el tipo de solicitud y manejarlo en consecuencia.

Esto conseguiría lo que está pidiendo. Además, las personas podrían usar la URL de "error" y seguir yendo a una página válida. Es decir, incluso después de obtener un error, podrían copiar/pegar la URL y habría una página GET válida para ello.

Dicho esto, este es un hack importante y no es algo que recomiendo que hagas. Tendrás que hacer mucho trabajo de campo y la ventaja es pequeña.

Editar: ejemplo ..

def new 
    if request.get? 
    @user = User.new 

    elsif request.post? 
    @user = User.new(params[:user]) 
    if @user.save 
     redirect_to users_path 
    else 
     render :new 
    end 
    end 
end 

También había necesidad de añadir rutas personalizadas.

0

Realmente, esto parece una solución de una línea en la prueba. (¿Por qué prefiere estar en la página/registrarse?).

Si es realmente importante, también puede esconder params temporalmente en la sesión var.

Cuestiones relacionadas