开发者

rails Devise - How to redirect to a Getting Started Link - After validating an email

开发者 https://www.devze.com 2023-01-30 15:37 出处:网络
I\'m using Devise with my rails 3 app. The app requires users to validate their email before continuing.

I'm using Devise with my rails 3 app. The app requires users to validate their email before continuing.

How can I redirect users to a specific url like /gettingstarted after they successfully validate their email address via the email confirmation m开发者_如何学Csg they receive?

Thanks


When a user clicks on the confirm link they are taken to a confirm page which checks the confirmation token and if it's valid automatically logs them into the application. You could overwrite the after_sign_in_path_for method in your ApplicationController (as shown on the Devise wiki) and then redirect them to your getting started page the first time a user logs in.

def after_sign_in_path_for(resource_or_scope)
  if resource_or_scope.is_a?(User) && first login
    getting_started_path
  else
    super
  end
end

For "first login" you could test if the confirmed_at timestamp is within a couple minutes of now, if your also using the trackable module in devise you can check if the sign_in_count is 1 or you could create your own field in the user model that tracks this information.


I'm checking devise source code at https://github.com/plataformatec/devise/blob/master/app/controllers/devise/confirmations_controller.rb

and seems that we have a callback to do it "after_confirmation_path_for"but I couldn't get it working without rewrite Devise::ConfirmationController

I hope that helps and if somebody get it working just defining after_confirmation_path_for just let us know.


I'm using the last_sign_in_at field from the 'trackable' model to achieve this. I've got the following code in my root action:

if current_user.last_sign_in_at.nil? then
  redirect_to :controller => :users, :action => :welcome
end

http://rubydoc.info/github/plataformatec/devise/master/Devise/Models/Trackable

Seems to work reasonably well.


inside the 'after_sign_in_path_for' the current_user.last_sign_in_at.nil? will not work since it is alerady after the first sign-in. However this will work

if current_user.sign_in_count == 1
# do 1 thing
else
# do another thing
end
0

精彩评论

暂无评论...
验证码 换一张
取 消