我正在设置用户模型,我有一个设置,其中新用户通过电子邮件发送激活令牌。当他们单击链接时,调用的控制器方法具有行
@user = User.find_by_activation_token! params[:activation_token]
现在我的激活令牌有24小时的到期时间,如果它已经过期,我希望销毁用户记录。这对我来说很容易在控制器中实现,但我想成为一个更好的Rails开发人员和更好的Ruby程序员,所以我想我应该把它放在模型中(瘦控制器,胖模型!)。我认为这也会让我更好地了解班级方法。
我已经做了几次尝试,但一直很不成功。到目前为止,这是我最好的努力;
def self.find_by_activation_token!(activation_token)
user = self.where(activation_token: activation_token).first #I also tried User.where but to no avail
if user && user.activation_token_expiry < Time.now
user.destroy
raise ActivationTokenExpired
else
raise ActiveRecord::RecordNotFound
end
user
end
我是否需要做很多改变才能做到我想做的事情,或者我完全走错了路?
答案 0 :(得分:2)
我想我得到了这个。您的条件逻辑有点偏离
def self.find_by_activation_token!(activation_token)
user = self.where(activation_token: activation_token).first #I also tried User.where but to no avail
# if this user exists AND is expired
if user && user.activation_token_expiry < Time.now
user.destroy
raise ActivationTokenExpired
# otherwise (user does not exist OR is not expired)
else
raise ActiveRecord::RecordNotFound
end
user
end
我认为应该更像这样:
def self.find_by_activation_token!(activation_token)
user = self.where(activation_token: activation_token).first #I also tried User.where but to no avail
raise ActiveRecord::RecordNotFound unless user
if user.activation_token_expiry < Time.now
user.destroy
raise ActivationTokenExpired
end
user
end