Разработать редирект после подтверждения

Как я могу создать перенаправление после подтверждения в devise?

Прежде чем я добавил confirmation module обычай after_sign_up_path в первый раз работал нормально login/signup но теперь, когда я нажимаю на ссылку подтверждения в электронном письме, он перенаправляет на путь, указанный для пути после входа в систему (профиль пользователя).

Моя цель здесь - создать мастер форм и страницу "Начало работы" для сбора дополнительной информации. Очевидное предостережение в том, что это перенаправление произойдет только 1 раз после подтверждения.

Я пробовал некоторые другие решения, которые были размещены в стеке, но ни одно из них, кажется, больше не работает..

6 ответов

Решение

По сути, вы хотите изменить эту строку Devise ConfirmationsController:

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

Так что это означает, что вам нужно переопределить действие шоу. Просто измените счастливый путь этого утверждения "if" в действии show к своему сердцу:

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

И ограниченный маршрут для этого (я помещаю представление и действие в контроллер регистрации, но вы можете изменить его на что угодно):

devise_for :users, controllers: { confirmations: 'confirmations' }
devise_scope :user do
  get '/confirmation-getting-started' => 'registrations#getting_started', as: 'confirmation_getting_started'
end

Действие шоу по умолчанию относится к защищенному after_confirmation_path_for метод, так что в качестве другого варианта вы можете просто изменить то, что возвращает этот метод.

Менее навязчивым способом достижения этого может быть просто переопределение after_confirmation_path_for метод Devise::ConfirmationsController,

Создать новый confirmations_controller.rb в app/controllers каталог:

class ConfirmationsController < Devise::ConfirmationsController

  private

  def after_confirmation_path_for(resource_name, resource)
    your_new_after_confirmation_path
  end

end

В config/routes.rb, добавьте эту строку, чтобы Devise использовал ваш ConfirmationsController, Это предполагает, что Devise работает на users стол (вы можете редактировать, чтобы соответствовать вашему).

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

Перезапустите веб-сервер, и он должен быть у вас.

Вы проверяли вики Devise? Это объясняет, как это сделать, с after_signup_path_for быть путем, чтобы определить в вашем случае.

Из вики:

Создан новый контроллер RegistrationsController:

class RegistrationsController < Devise::RegistrationsController
  protected

  def after_sign_up_path_for(resource)
    '/an/example/path'
  end
end

И добавьте маршрут, чтобы использовать его:

devise_for :users, :controllers => { :registrations => "registrations" }

Решение, данное @Lee Smith, работает отлично, но я хотел бы добавить небольшое дополнение, то есть нам не нужно добавлять действие new и create при переопределении контроллера подтверждений Devise для этого случая.

Как:

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

Затем в файле маршрута просто добавьте маршрутизацию для контроллера подтверждений.

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

Я только что прошел через все это, и ни один из других ответов не работал (2015-04-09 с разработкой 3.4.1).

Я хотел, чтобы после регистрации пользователь был перенаправлен на страницу входа с сообщением о подтверждении по электронной почте. Чтобы это работало, вот что я должен был сделать:

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

РЕДАКТИРОВАТЬ: Я только что нашел этот комментарий ниже, который отправил бы меня именно туда, где я должен был быть гораздо раньше.

Вот ссылка на after_inactive_sign_up_path_for, в котором упоминается Нильс: Разработать вики - marrossa 13 ноября 12 в 3:38

confirmation_path также необходимо настроить при работе с refinerycms, встроенными в приложение rails

Другие вопросы по тегам