Rails: `present?`より便利なActiveSupportの`presence`(翻訳)

概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: Use the presence method - Andy Croll 原文公開日: 2018/08/19 著者: Andy Croll 日本語タイトルは内容に即したものにしています。 Rails: present?より便利なActiveSupportのpresence(翻訳) Active SupportはRubyのコアライブラリにメソッドをたくさん追加するので、何かと非難が集中します。特に評判がよろしくないのは、RubyのObjectクラスへのパッチです。 RubyのあらゆるオブジェクトはObjectのサブクラスなので、Objectクラスにメソッドを追加すればコードのあらゆるオブジェクトにそのメソッドが追加されることになります。 Active Supportでの拡張に関するドキュメントでもう少し詳しく見てみましょう。 そうしたメソッドのひとつが#presenceです。これはお馴染みの#blank?や#present?に比べて馴染みの薄いメソッドです。 次のように書くのではなく 変数の値を表示するのに、次のように長ったらしい条件を使う。 class User < ApplicationRecord validates :email, presence: true def friendly_name if nickname.present? nickname elsif given_name.present? given_name else email.split(‘@’).first end end end 次のように書く Active Supportの#presenceメソッドを使う class User < ApplicationRecord validates :email, presence: true def friendly_name nickname.presence || given_name.presence || email_local_part end private def email_local_part email.split(‘@’).first end end そうすべき理由 #presenceメソッドは、オブジェクトが存在すればそのオブジェクトを返し、存在しなければnilを返したい場合にとても便利なショートカットです。 このメソッドは、Railsのビューでデータが存在するかどうかをチェクする部分でよく見かけるobject.present? ? object : nilという書き方と同等です。 このメソッドは、文字列や配列が空の場合にも有用なソリューションです。空の場合には#presenceはnilを返します。 そうすべきでない理由があるとすれば #presenceメソッドはRailsでしか利用できません。Rubyだけを使う場合、このメソッドのためだけにActive Supportをインクルードするほどの価値はおそらくないでしょう。 Railsを使う場合でも、既存のRubyクラスを拡張するこうしたRailsの習慣に抵抗を覚えるのも無理もないかもしれません。 自分のコードでモンキーパッチを使って既存クラスを改変する場合、標準のRubyクラスが思わぬ振る舞いを示すときにバグを踏みやすくなります。この種のコーディングスタイルで悩ましいのは、主にこうした点です。 モンキーパッチによる落とし穴がどうしても心配になる方だと、たとえRailsが当てるパッチであっても避けたい気持ちになるかもしれません。 Railsのライブラリセットはがっつりメンテされていて広く用いられているので、私はこうしたパッチは安全とみなしてコードがきれいになる方を選びます。 関連記事 Rails: pluckでメモリを大幅に節約する(翻訳) Ruby: `unless`はここぞというときまで使わないこと(翻訳)