通过电子邮件登录用户 - 设计

时间:2016-02-16 09:47:11

标签: ruby-on-rails ruby devise

在我的应用程序中,在成功交易后创建用户

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) %>

所以当点击这个时我会进入登录界面,但我想让用户自动登录并直接进入他们可以编辑密码的页面。

我该如何解决这个问题?

由于

1 个答案:

答案 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后清除它,以防止它被使用两次。同样,我们检查它是否比创建记录后的一天还要早。

相关问题