我正在使用Hartl的Unicode NULL character
教程user.rb
attr_accessor :activation_token
def User.digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
# Returns a random token.
def User.new_token
SecureRandom.urlsafe_base64
end
def send_activation_email
UserMailer.account_activation(self).deliver_now
end
def create_activation_digest
self.activation_token = User.new_token
self.activation_digest = User.digest(activation_token)
end
完成我的UsersController中显示的更新操作后,用户被重定向到root_url
def update
@user = User.find(params[:id])
...
elsif !params[:user][:email].blank?
if @user.authenticate(params[:user][:current_password])
@user.update_attributes(email_user_params)
if @user.save
@user.create_activation_digest
@user.deactivated
@user.send_activation_email
log_out
flash[:info] = "Please check email dude"
redirect_to root_url
else
flash[:danger] = "Email Update Failed"
redirect_to edit_user_email_path(@user)
end
else
flash[:danger] = "Current Password Is Incorrect"
redirect_to edit_user_email_path(@user)
end
...
def edit
@user = User.find(params[:id])
end
然后:
:activation_token = nil。
这是对的吗?
我在问,因为有一个Account Activation主题允许用户在单独的控制器操作中请求第二个验证电子邮件,而在所有这些主题中讨论都停留在路由问题上,因为在发送的电子邮件中,:activation_token
用作:id
,错误消息显示为:id -> nil
编辑:
类AccountActivationsController< ApplicationController中
def edit
user = User.find_by(email: params[:email])
if user && !user.activated? && user.authenticated?(:activation, params[:id])
user.activate
log_in user
flash[:success] = "Account activated!"
redirect_to user
else
flash[:danger] = "Invalid activation link"
redirect_to root_url
end
end
end
user.rb
def authenticated?(attribute, token)
digest = send("#{attribute}_digest")
return false if digest.nil?
BCrypt::Password.new(digest).is_password?(token)
end
答案 0 :(得分:0)
所以看来,由于您正在使用虚拟属性在某个时间点存储该令牌,该对象正在离开作用域并被重新加载,或者甚至会导致您丢失上下文。最好的办法是在您的User
表格中添加一列,以便在上下文之间保留它,并在适当的时候进行更新。
答案 1 :(得分:0)
我也遇到了这个问题。即使我删除了“ redirect_to root_url”,在代码运行到另一个动作(在同一控制器中)之后,attr_accessor仍然变为nil。
因此,我的结论是attr_accessor的生存期仅存在于同一动作中。