Railsのソースコード読んでみる | ActiveSupport presence編

f:id:sktktk1230:20190921180106p:plain

普段仕事で使っているRuby on Railsですが、ソースコードを読む機会もなかなかないので、試しにやってみることにしました

読めるようにするまで

以前書いた記事に読めるようにするまでの設定を画像キャプチャ付きで解説しましたので、よろしければこちらをご参照下さい
shitake4.hatenablog.com

読んだ箇所

Rails書いているとよく使う presence を今日は読んでみようと思います

どんな使い方だっけ?

Railsの日本語ドキュメントには記載がなかったので、APIリファレンスから確認してみます

1. APIリファレンスでの探し方

http://api.rubyonrails.org/ をブラウザで開くとページの左側にsearchがあるので、そこに presence を入力します

f:id:sktktk1230:20171218113512p:plain

2. 検索結果

該当する項目があったため、クリックしてみると
f:id:sktktk1230:20171218113529p:plain

以下の説明がありました

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 を探してみます

f:id:sktktk1230:20171218113555p:plain

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?メソッドのソースコードリーディングについてはこちら

shitake4.hatenablog.com

読んでみて

丁寧なコメントが書いてあり、仕様や使い方が書いてあり非常に読みやすいと感じます