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