2011-06-05 18 views
12

Estoy tratando de redirigir a los usuarios que han fallado en el formulario de registro (por ejemplo, ingresaron un nombre de usuario que ya se tomó, dejaron un campo en blanco, etc.)Idear: ¿redirigir a la falla de registro?

Tengo una falla personalizada configurada para los usuarios que falle la señal en forma, código de abajo:

class CustomFailure < Devise::FailureApp 

    def redirect_url 
     root_path 
    end 

    def respond 
     if http_auth? 
     http_auth 
    else 
     redirect 
    end 
end 

Sin embargo, he estado pegado sobre cómo configurar esta opción de registro para el fracaso. Idealmente, me gustaría redirigirlos/a root_path, ¿alguna idea? ¡Gracias!

Respuesta

18

Es probable que deba crear la subclase Devise::RegistrationsController y anular la acción de creación. Solo copie el método create desde here y modifique la redirección si no se guarda.

# app/controllers/registrations_controller.rb 
class RegistrationsController < Devise::RegistrationsController 


    def create 
    # modify logic to redirect to root url 
    end 


end 

Cambiar sus rutas para contar Idear utilizar su controlador:

# config/routes.rb 
devise_for :users, :controllers => {:registrations => "registrations"} 
+0

Funciona muy bien! ¡Muchas gracias por la ayuda! – ahuang7

5

Consejo:

Para mantener los mensajes de error Flash Añadir esta línea antes de la redirect_to en su anulación

resource.errors.full_messages.each {|x| flash[x] = x} 

Entonces en su registration_controller.rb:

def create 
    build_resource(sign_up_params) 

    if resource.save 
     yield resource if block_given? 
     if resource.active_for_authentication? 
      set_flash_message :notice, :signed_up if is_flashing_format? 
      sign_up(resource_name, resource) 
      respond_with resource, location: after_sign_up_path_for(resource) 
     else 
      set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format? 
      expire_data_after_sign_in! 
      respond_with resource, location: after_inactive_sign_up_path_for(resource) 
     end 
    else 
     clean_up_passwords resource 
     resource.errors.full_messages.each {|x| flash[x] = x} # Rails 4 simple way 
     redirect_to root_path 
    end 
end 
6

Es un poco tedioso modificar ciertas partes del diseño para satisfacer sus necesidades y sospecho que es porque la gema hace un buen trabajo para cubrir casos más comunes. Sin embargo, los casos extremos para el uso del dispositivo son muchos y su pregunta apunta a uno de ellos. Tenía que hacer algo similar, es decir, asegurarse de legado redirige a una página específica cuando un usuario realiza una de las siguientes:

  1. presenta el formulario en una forma vacía
  2. envía un correo electrónico ya existente. A continuación se muestra cómo lo manejé.

En primer lugar, crear un controlador llamado RegistrationsController que hereda de Diseñar :: RegistrationsController así:

class RegistrationsController < Devise::RegistrationsController 
end 

Dentro de este controlador tendrá que reemplazar el método de crear en legado. Vaya a la página de idear github aquí, https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb para ver el método de creación y copiar el código en ese método. A continuación, cree un método privado para anular la declaración de devolución del último bloque de la instrucción if. Su controlador debe verse así,

class RegistrationsController < Devise::RegistrationsController 


def create 
    build_resource(sign_up_params) 

    resource.save 
    yield resource if block_given? 
    if resource.persisted? 
    if resource.active_for_authentication? 
     set_flash_message! :notice, :signed_up 
     sign_up(resource_name, resource) 
     respond_with resource, location: after_sign_up_path_for(resource) 
    else 
     set_flash_message! :notice, :"signed_up_but_#{resource.inactive_message}" 
     expire_data_after_sign_in! 
     respond_with resource, location: after_inactive_sign_up_path_for(resource) 
    end 
    else 
    clean_up_passwords resource 
    set_minimum_password_length 
    response_to_sign_up_failure resource  
    end 
    end 

private 

def response_to_sign_up_failure(resource) 
    if resource.email == "" && resource.password == nil 
    redirect_to root_path, alert: "Please fill in the form" 
    elsif User.pluck(:email).include? resource.email 
    redirect_to root_path, alert: "email already exists" 
    end 
end 
end 

Debería funcionar.

+0

Me gusta esta idea, la mejor que he encontrado hasta ahora. Pero representa una forma vacía; ¿Ha encontrado una forma de recuperar el formulario con las entradas aún archivadas y un mensaje de error debajo de cada campo incorrecto? –

Cuestiones relacionadas