重写ActiveRecord类方法

时间:2012-06-13 13:15:46

标签: ruby-on-rails ruby ruby-on-rails-3

我正在设置用户模型,我有一个设置,其中新用户通过电子邮件发送激活令牌。当他们单击链接时,调用的控制器方法具有行

@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

我是否需要做很多改变才能做到我想做的事情,或者我完全走错了路?

1 个答案:

答案 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