Comment puis-je créer une redirection après confirmation dans l'appareil?
Avant d'ajouter le confirmation module
la douane after_sign_up_path
a bien fonctionné pour la première fois login/signup
mais maintenant, lorsque je clique sur le lien de confirmation dans l'e-mail, il redirige vers le chemin que j'ai défini pour le chemin après la connexion (profil utilisateur).
Mon objectif ici est de créer un assistant de formulaire et une page de "démarrage" pour collecter des informations supplémentaires. La mise en garde évidente est que cette redirection ne se produira qu'une seule fois, après confirmation.
J'ai essayé d'autres solutions qui ont été publiées sur la pile mais aucune ne semble fonctionner plus longtemps.
Essentiellement, vous souhaitez modifier cette ligne du Devise ConfirmationsController:
Cela signifie donc que vous devez remplacer l'action show. Modifiez simplement le chemin heureux de cette déclaration "si" dans l'action de spectacle au contenu de votre cœur:
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
Et un itinéraire délimité pour cela (je mets la vue et l'action dans le contrôleur des inscriptions mais vous pouvez le changer pour n'importe quoi):
devise_for :users, controllers: { confirmations: 'confirmations' }
devise_scope :user do
get '/confirmation-getting-started' => 'registrations#getting_started', as: 'confirmation_getting_started'
end
L'action show par défaut fait référence à la méthode protégée after_confirmation_path_for
, Donc comme autre option, vous pouvez simplement modifier ce que cette méthode retourne.
Une façon moins intrusive d'y parvenir pourrait être simplement de remplacer le after_confirmation_path_for
méthode de Devise::ConfirmationsController
.
Créer un nouveau confirmations_controller.rb
dans app/controllers
répertoire:
class ConfirmationsController < Devise::ConfirmationsController
private
def after_confirmation_path_for(resource_name, resource)
your_new_after_confirmation_path
end
end
Dans config/routes.rb
, ajoutez cette ligne pour que Devise utilise votre ConfirmationsController
personnalisé. Cela suppose que Devise fonctionne sur la table users
(vous pouvez éditer pour correspondre à la vôtre).
devise_for :users, controllers: { confirmations: 'confirmations' }
Redémarrez le serveur Web et vous devriez l'avoir.
Avez-vous vérifié le Devise wiki ? Il explique comment procéder, avec le after_signup_path_for
étant le chemin à définir dans votre cas.
Depuis le wiki:
Créez un nouveau contrôleur RegistrationsController:
class RegistrationsController < Devise::RegistrationsController
protected
def after_sign_up_path_for(resource)
'/an/example/path'
end
end
Et ajoutez un itinéraire pour l'utiliser:
devise_for :users, :controllers => { :registrations => "registrations" }
La solution donnée par @Lee Smith fonctionne parfaitement mais je souhaite ajouter un petit ajout, c'est nous n'avons pas besoin d'ajouter la nouvelle et de créer une action tout en surchargeant le contrôleur de confirmation Devise pour ce cas .
Comme en:
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
Ensuite, dans le fichier d'itinéraire, ajoutez simplement le routage pour le contrôleur de confirmations.
devise_for :users, controllers: { confirmations: "confirmations" }
Je viens de passer en revue tout cela et aucune des autres réponses n'a fonctionné (2015-04-09 avec le dispositif 3.4.1).
Ce que je voulais, c'était après l'inscription, l'utilisateur était redirigé vers la page de connexion avec un message sur un e-mail de confirmation. Pour que cela fonctionne, voici ce que je devais faire:
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
EDIT: Je viens de trouver ce commentaire ci-dessous qui m'aurait envoyé exactement où je devais être beaucoup plus tôt.
Voici la référence à after_inactive_sign_up_path_for qui mentionne Niels: Devise wiki - marrossa 13 novembre 12 à 3:38