web-dev-qa-db-fra.com

Concevoir la redirection après confirmation

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.

41
js111

Essentiellement, vous souhaitez modifier cette ligne du Devise ConfirmationsController:

https://github.com/plataformatec/devise/blob/master/app/controllers/devise/confirmations_controller.rb#L25

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.

19
Lee Smith

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.

126
MichaelZ

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" }
19
niels

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" }
2

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

2
Karl Wilbur