6

プロパティを持つUserオブジェクトがemailあり、大文字の最後の文字が必要だとしますemail

u = User.find(1)    
letter = u.email.upcase.last

uまたはemailnilこのチェーンにある場合、 NoMethodError: undefined method 'blah' for nil:Nilclass. ほとんどの場合、私はそれを回避できるはずですが、あるnilべきではない場所に到達したり、収容するのが難しい場合があります。1 つの方法は冗長になります。

u = User.find(1)
letter = nil
if u && u.email
 letter = u.email.upcase.last
end

しかし、これは、ビューやa.bunch.of.properties.down.a.hierarchy. tryRailsのメソッドについて読みました:

u = User.find(1)
letter = u.try(:email).try(:upcase).try(:last)

これはあまり冗長ではありませんが、これらすべての試みを書くのはうんざりです。そしてtry、チェーンを入れたら、最後まで使わなければなりません。より良い方法はありますか?

4

4 に答える 4

3

このスレッドを更新して、もう 1 つのオプションを追加したかっただけです。Ruby は現在 (2.3 以降)、安全なナビゲーション演算子である&.構文を提供しています。

そう:

u.email.upcase

次のようになります。

u.email&.upcase

Rail のtryメソッドとnil同様にNoMethodErrornil.

于 2017-11-30T05:23:39.253 に答える
1
User.find(1)    

ID 1 のユーザーが存在しない場合は例外が発生するため、ここで nil について心配する必要はありません

u.email

モデルにある場合

validates :email, presence: true

電子メールのないユーザーはデータベースに登録できないため、nil について心配する必要はありません。

しかし、Ruby コードで nil を処理する一般的な方法について質問していると思います。最近は Null Object パターンを使っています

http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/

http://robots.thoughtbot.com/post/20907555103/rails-refactoring-example-introduce-null-object

Rails: try を Null オブジェクト パターンに置き換える

https://github.com/martinciu/nullobject

于 2013-10-19T18:25:19.073 に答える
0

find の結果をマップすることもできます

[User.find(1)].map{|u| (u != nil ? u.mail : "no mail")}[0]
于 2014-06-13T16:41:45.220 に答える