Ruby on rails 为Rails中的设备自定义重置密码令牌

Ruby on rails 为Rails中的设备自定义重置密码令牌,ruby-on-rails,authentication,devise,mailer,reset-password,Ruby On Rails,Authentication,Devise,Mailer,Reset Password,我想做的是:设置一个邀请流程,当用户邀请一个新用户时,它会创建一个用户(电子邮件和密码),并向这个新用户发送一封欢迎电子邮件,其中包含重置其密码的链接 我的用户模型 def set_initial_password_reset! raw, enc = Devise.token_generator.generate(self.class, :reset_password_token) self.reset_password_token = enc self.r

我想做的是:设置一个邀请流程,当用户邀请一个新用户时,它会创建一个用户(电子邮件和密码),并向这个新用户发送一封欢迎电子邮件,其中包含重置其密码的链接

我的用户模型

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
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
我的主控制器包含

@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\u initial\u password\u reset中“提升”到用户模型中时
为了分析@token_reset,我得到了一个值,但在InviteController中该值为nil,我不知道如何获取该值

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

用户模型

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
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
而在控制器中

InviteMailer.new_user_invite(@invite, edit_password_path(@resource = User.find_by(id: @invite.recipient), reset_password_token: @resource.reset_password_token)).deliver
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
但是生成的令牌无效。我应该有这样一个令牌: 但我得到一个更长的代币

有关信息,请参见我的邮件控制器

InviteMailer.new_user_invite(@invite, edit_password_path(@resource = User.find_by(id: @invite.recipient), reset_password_token: @resource.reset_password_token)).deliver
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
classinvitemailer在视图中可用
@新建用户注册url=编辑密码路径
邮件(发送至:@invite.email,主题:“欢迎来到Travlr!”)
@trip=trip.find_by(id:@invite.trip_id)
@发件人=用户。查找人(id:@invite.sender)
结束

谢谢你的帮助

所以
设置初始密码重置的问题
是您无法获取原始令牌值的原因,该原始令牌值稍后将用于在密码重置过程中标识资源

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

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

因此,如果我们重新查看您发布的代码示例,控制器将看起来有点像下面:

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

在控制器中:

@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

谢谢!很好的解释如果这回答了你的问题,请接受答案。否则,如果有其他需要澄清的事项,请在评论中告知我:)