0

現在、ユーザーモデルを設定しており、新しいユーザーにアクティベーショントークンが電子メールで送信される設定があります。リンクをクリックすると、呼び出されるコントローラーメソッドに次の行が表示されます。

@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

これを実行するために多くの変更を加える必要がありますか、それとも完全に間違った方向に進んでいますか?

4

1 に答える 1

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
于 2012-06-13T13:29:12.170 に答える