我遇到了一个自动生成令牌的问题。在一个模型中,我使用自动生成令牌。
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
确认令牌是空的。
我需要在 params
因为在邮件中我使用了 Find_by(params[:confirm_token])
.
下面是我如何使用一个 confirm_token
在我看来。我想我需要 confirm_token
在 params
所以我必须在视图中也有它。
<%= f.hidden_field :confirm_token %>
上面描述的过程是正常的,问题出在邮件中。
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一样。