确认令牌 自动生成 NIL

问题描述 投票:0回答:1

我遇到了一个自动生成令牌的问题。在一个模型中,我使用自动生成令牌。

class User < ApplicationRecord
  before_create :generate_confirm_token

  def generate_confirm_token
    self.confirm_token = generate_token
  end

  def generate_token
    loop do
      token = SecureRandom.hex(10)
      break token unless User.where(confirm_token: token).exists?
    end
  end

创建用户后,token正确生成,但问题出在控制器上。

class Companies::StudentsController < ApplicationController

  def create
    @company = Company.find(params[:company_id])
    @student = @company.students.create(student_params)
     raise @student.inspect
    if @student.save
      StudentMailer.with(student: @student).welcome_email.deliver_now
      redirect_to company_students_path
    else
      render :new
    end
  end

student 包含 confirm_token 但在 params 确认令牌是空的。

enter image description here我需要在 params 因为在邮件中我使用了 Find_by(params[:confirm_token]).

下面是我如何使用一个 confirm_token 在我看来。我想我需要 confirm_tokenparams 所以我必须在视图中也有它。

  <%= f.hidden_field :confirm_token %>
ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-5
1个回答
0
投票

上面描述的过程是正常的,问题出在邮件中。

student 应该是在邮件中这样创建的。

@student = params[:student]

但我是这样做的

@student = Student.find_by(confirm_token: :confirm_token)

根据mailer文档,这是不正确的。

任何传递给with的键值对都会成为邮件操作的参数。所以with(user: @user, account: @user.account)使得params[:user]和params[:account]在mailer动作中可用。 就像控制器有params一样。

© www.soinside.com 2019 - 2024. All rights reserved.