Techioz Blog

Railsでスコープが失敗した場合にメッセージを返す方法はありますか?

概要

RailsプロジェクトにUserモデルがあります。スキーマには、ユーザーがアクティブかどうかを表すactiveと呼ばれるフィールドがあります。このようなスコープを追加しました。

# app/models/user.rb
scope :active, -> { where active: true }

私のユースケースは非常に単純で、次のようにアクティブなユーザーを見つけたいと考えています。

user = User.active.find_by!(token: token)

問題は、ActiveRecord::RecordNotFound エラーをキャッチするために begin とrescue を使用しないようにしたいことです。

私が望むのは、この例外をスローするのではなく、この例外をスローした場合のようにメッセージを返すことです。

validates :xyz, message: "invalid input"

この原因を達成する方法はありますか?

解決策

例外をキャッチしたくない場合は、find_by メソッドを使用してください。

bang を伴う Active Record メソッド (find_by!、save!、create!、first! など) でエラーが発生する

user = User.active.find_by(username: username)

if user.present?
  # do something with user
else
  # do something else
end