ruby-on-rails - signos - video sobre la confirmacion para adolescentes
Diseñar redirigir después de la confirmación (6)
¿Has consultado la wiki de Devise ? Explica cómo hacerlo, con after_signup_path_for
siendo la ruta para definir en su caso.
De la wiki:
Crear un nuevo controlador RegistrosController:
class RegistrationsController < Devise::RegistrationsController
protected
def after_sign_up_path_for(resource)
''/an/example/path''
end
end
Y agrega una ruta para usarlo:
devise_for :users, :controllers => { :registrations => "registrations" }
¿Cómo puedo crear una redirección de confirmación posterior en el diseño?
Antes de agregar el confirmation module
la after_sign_up_path
funcionó bien por primera vez, pero ahora cuando hago clic en el enlace de confirmación en el correo electrónico, redirige a la ruta que establecí para la ruta de acceso posterior (perfil de usuario).
Mi objetivo aquí es crear un asistente de formulario y una página de "inicio" para recopilar información adicional. La advertencia obvia es que esta redirección solo ocurrirá una vez, luego de la confirmación.
He intentado algunas otras soluciones que se han publicado en la pila, pero ninguna de ellas parece funcionar más.
Acabo de terminar todo esto y ninguna de las otras respuestas funcionó (2015-04-09 con el dispositivo 3.4.1).
Lo que quería era después de la suscripción, el usuario es redirigido a la página de inicio de sesión con un mensaje sobre un correo electrónico de confirmación. Para que funcione, esto es lo que tenía que hacer:
class RegistrationsController < Devise::RegistrationsController
protected
# This is the method that is needed to control the after_sign_up_path
# when using confirmable.
def after_inactive_sign_up_path_for(resource)
new_user_session_path
end
end
EDITAR: Acabo de encontrar este comentario a continuación, que me habría enviado exactamente donde necesitaba estar mucho antes.
Aquí está la referencia al after_inactive_sign_up_path_for que menciona Niels: Devise wiki - marrossa 13 de noviembre de 12 a 3:38
Esencialmente, desea cambiar esta línea del Controlador de Confirmaciones Devise:
Entonces, esto significa que debes anular la acción de mostrar. Simplemente modifique la ruta feliz de esa declaración "if" en la acción show al contenido de su corazón:
class ConfirmationsController < Devise::ConfirmationsController
def new
super
end
def create
super
end
def show
self.resource = resource_class.confirm_by_token(params[:confirmation_token])
if resource.errors.empty?
set_flash_message(:notice, :confirmed) if is_navigational_format?
sign_in(resource_name, resource)
respond_with_navigational(resource){ redirect_to confirmation_getting_started_path }
else
respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render_with_scope :new }
end
end
end
Y una ruta delimitada para ello (pongo la vista y la acción en el controlador de registros pero puede cambiarlo a lo que sea):
devise_for :users, controllers: { confirmations: ''confirmations'' }
devise_scope :user do
get ''/confirmation-getting-started'' => ''registrations#getting_started'', as: ''confirmation_getting_started''
end
La acción de mostrar predeterminada se refiere al método protegido after_confirmation_path_for
, por lo que como otra opción, puede modificar lo que devuelve ese método.
La confirmation_path
también debe configurarse al trabajar con refinerías integradas en una aplicación de rieles
La solución ofrecida por @Lee Smith funciona a la perfección, pero deseo agregar una pequeña adición, es decir , no necesitamos agregar la acción nueva y crear al reemplazar el controlador de confirmaciones Devise para este caso.
Como:
class ConfirmationsController < Devise::ConfirmationsController
def show
self.resource = resource_class.confirm_by_token(params[:confirmation_token])
if resource.errors.empty?
set_flash_message(:notice, :confirmed) if is_navigational_format?
sign_in(resource_name, resource)
respond_with_navigational(resource){ redirect_to your_desired_redirect_path }
else
respond_with_navigational(resource.errors, status: :unprocessable_entity){ render_with_scope :new }
end
end
end
Luego, en el archivo de ruta, simplemente agregue el enrutamiento para el controlador de confirmaciones.
devise_for :users, controllers: { confirmations: "confirmations" }
Una forma menos intrusiva de lograr esto podría estar anulando el método after_confirmation_path_for
de Devise::ConfirmationsController
.
Crea un nuevo confirmations_controller.rb
en el directorio de app/controllers
:
class ConfirmationsController < Devise::ConfirmationsController
private
def after_confirmation_path_for(resource_name, resource)
your_new_after_confirmation_path
end
end
En config/routes.rb
, agregue esta línea para que Devise use su ConfirmationsController
personalizado. Esto supone que Devise opera en la tabla de users
(puede editar para que coincida con la suya).
devise_for :users, controllers: { confirmations: ''confirmations'' }
Reinicie el servidor web, y debería tenerlo.