Conception redirection après confirmation

comment créer une redirection après confirmation dans devise?

avant d'ajouter le confirmation module la coutume after_sign_up_path a bien fonctionné pour la première fois login/signup mais maintenant, quand je clique sur le lien de confirmation dans le courriel, il redirige vers le chemin que j'ai défini pour le chemin de connexion après (profil de l'utilisateur).

mon but ici est de créer un assistant de formulaire et une page "démarrage" pour collecter des informations supplémentaires. La mise en garde évidente étant que cette redirection ne se produira 1 fois, sur confirmation.

j'ai essayé d'autres solutions qui ont été postées sur stack mais aucune ne semble fonctionner plus..

37
demandé sur rohin-arka 2012-06-07 10:20:19

6 réponses

essentiellement, vous voulez changer cette ligne du contrôleur de confirmation de Devise:

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

cela signifie que vous devez annuler l'action show. Il suffit de modifier le chemin heureux de cette déclaration de "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 une route scoped pour elle (je mets la vue et l'action dans les enregistrements contrôleur mais vous pouvez le modifier en quoi que ce soit):

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 se réfère à laafter_confirmation_path_for méthode, donc comme une autre option, vous pouvez juste modifier ce que cette méthode retourne.

19
répondu Lee Smith 2012-07-02 19:19:27

une façon moins intrusive d'y parvenir serait simplement de passer outre le after_confirmation_path_for méthode Devise::ConfirmationsController.

Créer un nouveau confirmations_controller.rbapp/controllers répertoire:

class ConfirmationsController < Devise::ConfirmationsController

  private

  def after_confirmation_path_for(resource_name, resource)
    your_new_after_confirmation_path
  end

end

config/routes.rb, ajouter cette ligne pour que Devise utilise votre custom ConfirmationsController. Cela suppose que le dispositif fonctionne sur users table (vous pouvez modifier pour correspondre à la vôtre).

devise_for :users, controllers: { confirmations: 'confirmations' }

Redémarrer le serveur web, et vous devriez l'avoir.

121
répondu MichaelZ 2013-02-27 15:24:59