Подтвердить что ты не робот

Настроить перенаправление после подтверждения

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

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

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

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

4b9b3361

Ответ 1

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

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

Итак, это означает, что вам нужно переопределить действие show. Просто измените счастливый путь этого выражения "если" в действии 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, так что вы можете просто изменить способ возврата этого метода.

Ответ 2

Менее интрузивным способом достижения этого может быть просто переопределение метода 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' }

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

Ответ 3

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

Из wiki:

Создайте новый контроллер РегистрацияСодержание:

class RegistrationsController < Devise::RegistrationsController
  protected

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

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

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

Ответ 4

Я просто прошел через все это, и ни один из других ответов не работал (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

EDIT: Я только что нашел этот комментарий ниже, который бы послал меня точно, где мне нужно было быть намного раньше.

Вот ссылка на after_inactive_sign_up_path_ для этого упоминает Нильса: Devise wiki - marrossa 13.11.12 в 3:38

Ответ 5

Решение, данное @Lee Smith, работает отлично, но я хочу добавить небольшое дополнение, то есть нам не нужно добавлять новое и создавать действие, переопределяя контроллер подтверждения 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" }

Ответ 6

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