Movatterモバイル変換


[0]ホーム

URL:


Tech Rachoエンジニアの「?」を「!」に。
  1. TOP
  2. Ruby / Rails関連
  3. Rails: present?より便利なActiveSupportのpresenceメソッド(翻訳)
  • Ruby / Rails関連

Rails: present?より便利なActiveSupportのpresenceメソッド(翻訳)

更新情報

  • 2018/09/27: 初版公開
  • 2021/02/26: 細部を更新

概要

原著者の許諾を得て翻訳・公開いたします。

日本語タイトルは内容に即したものにしています。

Rails:present?より便利なActiveSupportのpresenceメソッド(翻訳)

Active SupportはRubyのコアライブラリにメソッドをたくさん追加するので、何かと非難が集中します。特に評判がよろしくないのは、RubyのObjectクラスへのパッチです。

RubyのあらゆるオブジェクトはObjectのサブクラスなので、Objectクラスにメソッドを追加すればコードのあらゆるオブジェクトにそのメソッドが追加されることになります。

Active Supportでの拡張に関するドキュメントでもう少し詳しく見てみましょう。

そうしたメソッドのひとつが#presenceです。これはお馴染みの#blank?(訳注:#empty?のエイリアス)や#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  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という書き方と同等です。

このメソッドは、文字列や配列が空の場合にも有用なソリューションです。空の場合には#presencenilを返します。

そうしない理由があるとすれば

#presenceメソッドはRailsでしか利用できません。Rubyだけを使う場合、このメソッドのためだけにActive Supportをインクルードするほどの価値はおそらくないでしょう。

Railsを使う場合でも、既存のRubyクラスを拡張するこうしたRailsの習慣に抵抗を覚えるのも無理もないかもしれません。

自分のコードでモンキーパッチを使って既存クラスを改変する場合、標準のRubyクラスが思わぬ振る舞いを示すときにバグを踏みやすくなります。この種のコーディングスタイルで悩ましいのは、主にこうした点です。

モンキーパッチによる落とし穴が心配になってしまうと、たとえRailsが当てるパッチであっても避けたい気持ちになるかもしれません。

Railsのライブラリセットはしっかりメンテされていて広く用いられているので、私はこうしたパッチは安全とみなして、コードをきれいに書ける方を選びます。

関連記事

Rails: ActiveRecordのスコープで`present?`を使うとパフォーマンスが落ちることがある(翻訳)

Rails: pluckでメモリを大幅に節約する(翻訳)


この記事を書いた人

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株式会社のお問い合せフォームよりお問い合せ下さい。

Our Services

各種サービスのご依頼やお問い合わせなど、お気軽にご相談ください。

Our Products

製品のご利用希望や疑問・質問など、お気軽にご相談ください。

Recruit & Contacts

お問い合わせ、採用へのお申し込みはこちらから。

積極採用中 開発エンジニアCONTACT

関連記事

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。
CONTACT FORM

[8]ページ先頭

©2009-2025 Movatter.jp