更新情報
- 2018/09/27: 初版公開
- 2021/02/26: 細部を更新
概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: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?
(訳注:#empty?
のエイリアス)や#present?
に比べて馴染みの薄いメソッドです。
- Rails API:
presence
-- Object - Rails API:
empty?
-- ActiveRecord::DatabaseConfigurations - Rails API:
present?
-- Object
次のように書くのではなく
変数の値を表示するのに、次のように長ったらしい条件を使う。
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 endend
次のように書く
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 endend
そうする理由
#presence
メソッドは、オブジェクトが存在すればそのオブジェクトを返し、存在しなければnil
を返したい場合にとても便利なショートカットです。
このメソッドは、Railsのビューでデータが存在するかどうかをチェクする部分でよく見かけるobject.present? ? object : nil
という書き方と同等です。
このメソッドは、文字列や配列が空の場合にも有用なソリューションです。空の場合には#presence
はnil
を返します。
そうしない理由があるとすれば
#presence
メソッドはRailsでしか利用できません。Rubyだけを使う場合、このメソッドのためだけにActive Supportをインクルードするほどの価値はおそらくないでしょう。
Railsを使う場合でも、既存のRubyクラスを拡張するこうしたRailsの習慣に抵抗を覚えるのも無理もないかもしれません。
自分のコードでモンキーパッチを使って既存クラスを改変する場合、標準のRubyクラスが思わぬ振る舞いを示すときにバグを踏みやすくなります。この種のコーディングスタイルで悩ましいのは、主にこうした点です。
モンキーパッチによる落とし穴が心配になってしまうと、たとえRailsが当てるパッチであっても避けたい気持ちになるかもしれません。
Railsのライブラリセットはしっかりメンテされていて広く用いられているので、私はこうしたパッチは安全とみなして、コードをきれいに書ける方を選びます。
関連記事
hachi8833
Twitter:@hachi8833、GitHub:@hachi8833コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。これまでにRuby on Rails チュートリアル第2版のコンテンツ監修、Railsガイドのコンテンツ作成を担当。かと思うと、正規表現の粋を尽くした日本語エラーチェックサービスenno.jpを運営。実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.comに移転。Amazonウィッシュリスト:https://bit.ly/32aAmiI
hachi8833の書いた記事一覧へ
本記事の内容へのお問い合せはTwitterで@techrachoへMentionまたはDMにてご連絡頂くか、運営会社であるBPS株式会社のお問い合せフォームよりお問い合せ下さい。
Category Ranking
- 1
- Ruby / Rails関連
開発人生25年で学んだ7つのソフトウェア原則(翻訳)
- 2
- Ruby / Rails関連
Rails 8: strong parametersの新しいparams.expectの使い方(翻訳)
- 3
- Ruby / Rails関連
Railsスケーリング(1)Puma、コンカレンシー、GVLのパフォーマンスへの影響を理解する(翻訳)
- 4
- Ruby / Rails関連
Rails: data-disable-withの過信は禁物: 高速に連打すると二重送信できます
- 5
- Ruby / Rails関連
Rails 8.1: 生SQLやArelのブーリアン型カラムをTRUEやFALSEと比較できるようになった(翻訳)