普段仕事で使っているRuby on Railsですが、ソースコードを読む機会もなかなかないので、試しにやってみることにしました
読めるようにするまで
以前書いた記事に読めるようにするまでの設定を画像キャプチャ付きで解説しましたので、よろしければこちらをご参照下さい
shitake4.hatenablog.com
読んだ箇所
Rails書いているとよく使う presence
を今日は読んでみようと思います
どんな使い方だっけ?
Railsの日本語ドキュメントには記載がなかったので、APIリファレンスから確認してみます
1. APIリファレンスでの探し方
http://api.rubyonrails.org/
をブラウザで開くとページの左側にsearchがあるので、そこに presence
を入力します
2. 検索結果
該当する項目があったため、クリックしてみると
以下の説明がありました
presence()
Returns the receiver if it's present otherwise returns nil. object.presence is equivalent to
object.present? ? object : nil
For example, something like
state = params[:state] if params[:state].present?
country = params[:country] if params[:country].present?
region = state || country || 'US'becomes
region = params[:state].presence || params[:country].presence || 'US'
@return [Object]
引用:APIリファレンス
object.present?の結果がtrueの場合は、objectそのものを返し、falseの場合は、nilを返すという仕様のようです
For exampleにあるように変数に値がある場合はその値を使用したい。ただ空の場合はデフォルト値を入れたいなどの場合に
非常にコードをシンプルに記述することが可能です
ソースコードを読んでみる
1. railsプロジェクトのactivesupportにある機能なので、activesupportディレクトリのlib配下で presence
を探してみます
2. 該当箇所が1箇所だったので、それを見てみます
1. activesupport > lib > active_support > core_ext > object > blank.rb
# Returns the receiver if it's present otherwise returns +nil+. # <tt>object.presence</tt> is equivalent to # # object.present? ? object : nil # # For example, something like # # state = params[:state] if params[:state].present? # country = params[:country] if params[:country].present? # region = state || country || 'US' # # becomes # # region = params[:state].presence || params[:country].presence || 'US' # # @return [Object] def presence self if present? end
メソッドの中身を見てみると、レシーバに対して present?
しており、trueであればselfを返すようです
falseの場合はnilが返り値となります
rubyは最後に評価された値を返すという言語仕様な為、評価するものがなにも無い = nilということになります
※ blank?メソッドのソースコードリーディングについてはこちら
読んでみて
丁寧なコメントが書いてあり、仕様や使い方が書いてあり非常に読みやすいと感じます