我现在正在设置用户模型,并且我已经设置了一个新用户通过电子邮件发送的激活令牌。当他们点击链接时调用的控制器方法有行覆盖ActiveRecord类的方法
@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
我需要改变很多才能做到我希望做的事,或者我完全错误吗?
为什么这不是为你工作? –
好点。如果我调用User.find_by_activation_token!(valid_token),我会得到一个RecordNotFound异常。我的self.where(activation_token:activation_token)似乎有问题。 – brad
是的。这里有一些控制台输出来演示。 https://gist.github.com/2924053 – brad