自定义reset_password_token以在Rails中进行设计

我想做的是:设置邀请过程,当用户邀请新用户时,它会创建一个用户(电子邮件和密码),并向该新用户发送欢迎电子邮件,并提供一个链接以重置其密码。

我的用户模型

def set_initial_password_reset!
    raw,enc = Devise.token_generator.generate(self.class,:reset_password_token)

      self.reset_password_token   = enc
      self.reset_password_sent_at = Time.now.utc
      save(validate: false)
      @token_reset = raw
end

我的InviteController包含

@user_invitee = User.new(email: invite_params[:email]) do |u|
        u.password = SecureRandom.hex
        # raise
        end
   @user_invitee.skip_confirmation!
   @user_invitee.save
   @user_invitee.set_initial_password_reset!
   create_invite

   if @invite.save!
      InviteMailer.new_user_invite(@invite,edit_password_path(@resource = User.find_by(id: 
      @invite.recipient),reset_password_token: @token_reset)).deliver
          redirect_to trip_trip_form(@trip)

当我在set_initial_password_reset!中“提升”到用户模型以分析@token_reset时,我有一个值,但是在InviteController中,该值为nil,我不知道如何获取该值?

我尝试了在stackoverflow上看到的其他方法来实现该过程,例如:

用户模型

def set_initial_password_reset!
    self.reset_password_token   = Devise.token_generator.generate(self.class,:reset_password_token)
    self.reset_password_sent_at = Time.now.utc
    save(validate: false)
  end

InviteController

InviteMailer.new_user_invite(@invite,edit_password_path(@resource = User.find_by(id: @invite.recipient),reset_password_token: @resource.reset_password_token)).deliver

,但生成的令牌无效。我应该有一个这样的令牌:http://localhost:3000/users/password/edit?reset_password_token=i8t77fcdsj3PYRymVdEK 但是我得到了更长的令牌。

有关信息我的邮件收发器控制器

class InviteMailer < Applicationmailer
  def new_user_invite(invite,edit_password_path)
    @invite = invite # Instance variable => available in view
    @new_user_registration_url = edit_password_path
    mail(to: @invite.email,subject: 'Welcome to Travlr!')
    @trip = Trip.find_by(id: @invite.trip_id)
    @sender = User.find_by(id: @invite.sender)
  end

感谢您的帮助!

z298961 回答:自定义reset_password_token以在Rails中进行设计

因此set_initial_password_reset!的问题在于您没有获得原始令牌值,该令牌值稍后将用于在密码重置过程中标识资源。

从devise(如下)中查看重置密码令牌方法的实现

    def set_reset_password_token
      raw,enc = Devise.token_generator.generate(self.class,:reset_password_token)

      self.reset_password_token   = enc
      self.reset_password_sent_at = Time.now.utc
      save(validate: false)
      raw
    end

它将加密的生成的令牌保存到用户对象并返回原始值。 然后,应将该原始值包含在收件人(用户)将要使用的邮件/链接中,同时确认确实是他/她可以重置密码。

因此,如果我们重新访问您发布的代码示例,则控制器将如下所示:

在模型中:(与devise方法基本相同。唯一的区别是devise方法是私有afaik)

def set_initial_password_reset!
  raw,enc   = Devise.token_generator.generate(self.class,:reset_password_token)
  self.reset_password_token = enc
  self.reset_password_sent_at = Time.now.utc
  save(validate: false)
  raw
end

在控制器中:

@user_invitee = User.new(email: invite_params[:email]) do |u|
    u.password = SecureRandom.hex
    # raise
end
@user_invitee.skip_confirmation!
@user_invitee.save
token = @user_invitee.set_initial_password_reset!
create_invite

InviteMailer.new_user_invite(@invite,edit_password_path(User.find_by(id: @invite.recipient),reset_password_token: token)).deliver
本文链接:https://www.f2er.com/3056214.html

大家都在问