2011-05-23 33 views
10

Estoy tratando de integrar Devise en mi aplicación. Necesito implementar el formulario de inicio de sesión en la parte superior de la página (he implementado este formulario en la página de diseño) y he implementado el registro que contiene el formulario de registro. Pero muestra errores de validación para ambos formularios cuando intenté enviar datos de registro incorrectos.Devise. Registro e inicio de sesión en la misma página

+0

¿Puedes mostrar el código de las visitas/controladores relevantes? –

+0

[Compruebe mi respuesta aquí] (http://stackoverflow.com/a/17001874/1297435) sobre este caso. –

Respuesta

6

Sin más información, es difícil de adivinar cuál es el problema. He encontrado las páginas wiki a ser realmente útil (y cada vez más), aunque es posible que ya los examinó:

Devise Wiki Pages

dos páginas que podrían ser relevantes para sus necesidades:

Display a custom sign_in form anywhere in your app

Create custom layouts

Espero que esto ayude!

- ff

+0

Encontré un problema que no dependía del Devise. Cambio el nombre del objeto para cada formulario y funciona correctamente. –

+1

@VitalyAksionchyk ¿puedes describir lo que hiciste con más detalle? – flynfish

+0

Para mí, el cambio de 'simple_form_for (" User ", ...' to 'simple_form_for (" user ", ...' ayudó) – mirelon

0

Usted debe tener dos formularios de la página - una para la firma y uno para el registro. Si quieres un formulario único y múltiples acciones potenciales que van a necesitar un par de botones que manejan conseguir lado del cliente y cambiar el método de acción & de la forma a la vía apropiada dependiendo desea crear un usuario o una sesión.

Si cree que ya ha hecho esto, el problema es casi seguro que se encuentra en el código. Si quisieras compartirlo con nosotros, podríamos señalar algo que quizás te hayas perdido.

3

El problema de ver los errores de validación para ambas formas se deriva de las 2 cosas. Primero, las formas de diseño usan un ayudante genérico de "recursos". Esto crea un objeto Usuario, y ese mismo objeto de usuario se usa tanto para el registro como para el formulario de inicio de sesión. En segundo lugar, los errores de diseño se muestran normalmente con el 'devise_error_messages!' ayudante que usa ese mismo recurso compartido.

Para iniciar sesión y suscribirse en la misma página, debe crear diferentes objetos de usuario para cada formulario y una nueva forma de mostrar los mensajes de error.

En primer lugar, usted necesita para crear su propio controlador de registro (en app/controllers/usuarios /)

class Users::RegistrationsController < Devise::RegistrationsController 
    include DevisePermittedParameters 

    protected 

    def build_resource(hash=nil) 
    super 
    # Create an instance var to use just for the sign up form 
    @sign_up_user = self.resource 
    end 
end 

y actualizar su archivo de rutas en consecuencia

devise_for :users, controllers: { 
    registrations: 'users/registrations' 
} 

Seguidamente se le necesita sus propios mensajes de error y recursos auxiliares. Crear un nuevo ayudante como devise_single_page_helper.rb y añadir lo siguiente:

module DeviseSinglePageHelper 
    def devise_error_messages_for_same_page(given_resource) 
    return "" if given_resource.errors.empty? 

    messages = given_resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join 
    sentence = I18n.t("errors.messages.not_saved", 
         count: given_resource.errors.count, 
         resource: given_resource.class.model_name.human.downcase) 

    html = <<-HTML 
    <div id="error_explanation"> 
    <h2>#{sentence}</h2> 
    <ul>#{messages}</ul> 
    </div> 
    HTML 

    html.html_safe 
    end 

    def sign_up_user 
    @sign_up_user ||= User.new(username: 'su') 
    end 

    def sign_in_user 
    @sign_in_user ||= User.new(username: 'si') 
    end 
end 

Por último, en su opinión, actualizar sus formas, así:

-# The sign up form 
    = simple_form_for(sign_up_user, url: registration_path(resource_name)) do |f| 
    -#... 
    = devise_error_messages_for_same_page(sign_up_user) 


    -# The sign in form 
    = simple_form_for(sign_in_user, url: sessions_path(resource_name)) do |f| 
    #... 
    = devise_error_messages_for_same_page(sign_in_user) 

Todo esto junto le da 2 objetos diferentes - 1 para registrarse y 1 para iniciar sesión. Esto evitará que los mensajes de error de una se muestren en la otra.Tenga en cuenta que recomendamos colocar los dos formularios en su página de inicio de sesión (y tal vez redirigir la página de inicio de sesión predeterminada a la página de inicio de sesión) porque, de forma predeterminada, un intento fallido de inicio de sesión redirigirá a la página de inicio de sesión.

Cuestiones relacionadas