私の現在のRailsプログラムで
user = User.find(10)
ID = 10のユーザーがいない場合、次のような例外が発生します。
ActiveRecord::RecordNotFound: Couldn't find User with ID=10
例外を発生させる代わりにnilを取得できますか?
unless user = Challenge.find(10)
puts "some error msg"
end
レコードがなく、begin/rescueを使用したくないときに、nilを取得したいだけです。
ありがとう
はい、できます:
Challenge.find_by_id(10)
Rails 4および5:
Challenge.find_by(id: 10)
Rails 4、ダイナミックファインダ-受け入れられた回答で使用されたfind_by_id
など)は廃止されました。
今後は、新しい構文を使用する必要があります。
Challenge.find_by id: 10
activeRecord Query Interfaceを使用するだけで、これを少しハックすることができます。
例外を発生させる代わりに、nilを返します
User.where(:id => 10).first
単に例外をキャッチしてみませんか?あなたのケースは、例外が何のために作られたかのように見えます:
begin
user = User.find(10)
rescue ActiveRecord::RecordNotFound
puts "some error msg"
end
レスキューブロックのエラーから回復する場合(プレースホルダーユーザー(nullパターン)を設定するなど)、このブロックの下でコードを続行できます。そうしないと、「begin」と「rescue」の間のブロックに「happy case」のすべてのコードを配置するだけで済みます。
これを試すことができますChallenge.exists?(10)
mongoidと苦労している人にとって、find
とfind_by
メソッドは例外を発生させます-Railsバージョン!
オプション (つまりraise_not_found_error)がありますが、これはfalseに設定できますが、falseyがfind
メソッドを生成しない場合例外も。
したがって、mongoidユーザーの解決策は嫌なコードです:
User.where(id: 'your_id').first # argghhh
次のように簡単です:
user = User.find(10) rescue nil
Find_byを必須属性(あなたの場合はid)と共に使用すると、指定されたidが見つからない場合にエラーを返す代わりにnilを返します。
user = Challenge.find_by_id(id_value)
または、新しい形式を使用できます。
user = Challenge.find_by id: id_value
Whereを使用することもできますが、whereは0個以上のレコードを含むアクティブなレコードリレーションを返すことを知っている必要があります。
user = Challenge.where(id: id_value).first