在我的应用程序中,在成功交易后创建用户
def create_real_user
return unless current_or_guest_user.is_guest?
generated_password = Devise.friendly_token.first(8)
@user = User.new(
is_guest: false,
first_name: params[:first_name],
last_name: params[:last_name],
email: params[:email],
password: generated_password,
password_confirmation: generated_password,
braintree_id: @result.transaction.customer_details.id
)
@user.save(validate: false)
RegistrationMailer.welcome(@user, generated_password).deliver_now
端
正如您所看到的那样,我们发送了一封电子邮件,并建议为他们设置密码,但如果他们想要更改密码,请访问链接
Your current password is <%= @password %> but if you would like to change it then please visit <%= link_to 'Change my password', edit_user_registration_path(@user.id) %>
所以当点击这个时我会进入登录界面,但我想让用户自动登录并直接进入他们可以编辑密码的页面。
我该如何解决这个问题?
由于
答案 0 :(得分:1)
没有快速解决方案,但这是可能的。
包含此特殊登录案例的路线...
resources :users do
member do
get 'token_link'
end
end
这为您提供了一个新的辅助方法`token_link_user_path
您需要在创建记录时在User表中创建token
字段,并通过before_create
class User
before_create :generate_token
def generate_token
user.token = SecureRandom.urlsafe_base64(nil, false)
end
...
end
在您的电子邮件中包含链接...
link_to 'access your account', token_link_user_path(@user.token)
在您的用户控制器中......
def token_link
@user = User.find_by(token: params[:id])
@user = nil if @user && @user.created_at < Time.now - 1.day
unless @user
flash[:error] = 'Invalid log in'
redirect_to root_path
end
@user.update_attribute(:token, nil)
... do here any processing, renders, or redirects you'd like
end
请注意我们如何在使用token_link后清除它,以防止它被使用两次。同样,我们检查它是否比创建记录后的一天还要早。