LoginSignup
7
5

More than 5 years have passed since last update.

Rubyで定数モジュールを作った時に二重で定数を書かずに済む方法

Last updated at Posted at 2016-06-28

Rubyでconstantクラスを作った時にちょっとした気づきがあったのでメモです

「定数がいろいろと定義されている中で一部違うんだけど、他の定数はほぼ同じ」みたいな状況の中でただダラダラと書いていくとこんな感じになります
DRYじゃないですね

module HogePolicy
  module Limited
    NAME = '規制'
    MAX_SUM = 30
  end

  module Unlimited
    NAME = '有料'
    MAX_SUM = Float::Infinity
  end

  module Trial
    NAME = '試用'
    MAX_SUM = Float::Infinity
  end
end

で、こういうの何かできないかなーって思ってたんですけど、よくよく考えてみると include 使えば良いんじゃ無いってなってやってみたらできてしまいました
定数の数が増えると効果が目に見えて出てきます

module HogePolicy
  module Limited
    NAME = '規制'
    MAX_SUM = 30
  end

  module Unlimited
    NAME = '有料'
    MAX_SUM = Float::Infinity
  end

  module Trial
    include HogePolicy::Unlimited

    NAME = '試用'
    # MAX_SUMは定義されている
  end
end

ちなみにこういうのを呼び出すときも Limited にするか Unlimited にするか Trial にするかみたいなロジックを書こうとした時にModelクラスにenum作って、更に判定メソッド作っておくとview側でスッキリ書けます

class User < ActiveRecord::Base
  enum limiter: {
    limited: 'limited',
    unlimited: 'unlimited',
    trial: 'trial'
  }

  def limitation
    if limited?
      HogePolicy::Limited
    elsif unlimited?
      HogePolicy::Unlimited
    elsif trial?
      HogePolicy::Trial
    end
  end
end

こういう感じで書いておけば user.limitation を呼び出せば自然とそのユーザのステータス定数を持ってくることが可能なので便利です
特にerrorハンドリングなどのところとかに HogePolicy::ステータス とか書かなくて済むので、スッキリした感じになります
地味に好きな書き方です

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5