Настроить перенаправление после подтверждения
Как я могу создать перенаправление после подтверждения?
Прежде чем я добавил confirmation module
, пользовательский after_sign_up_path
работал отлично в первый раз login/signup
, но теперь, когда я нажимаю ссылку подтверждения в письме, он перенаправляет на путь, который я установил для пути после входа (профиль пользователя).
Моя цель здесь - создать мастер формы и страницу "начать работу" для сбора дополнительной информации. Очевидное предостережение в том, что это перенаправление произойдет только один раз, после подтверждения.
Я пробовал некоторые другие решения, которые были отправлены в стек, но ни один из них больше не работает.
Ответы
Ответ 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