Sha256: 72d5a1503f21aec4ff0487c0cb0e984d44561063475355de064c630dc78c048a

Contents?: true

Size: 1.34 KB

Versions: 1

Compression:

Stored size: 1.34 KB

Contents

require "i18n"

require "labelizer/version"

module Labelizer
  def self.included(base)
    base.send :extend, ClassMethods
  end

  module ClassMethods
    def labelize(attr, labels, converter: {})
      @labelizer_converters ||= {}
      @labelizer_converters[attr.to_sym] = converter

      define_method :"#{attr}_labelized" do
        self.class.labelized[attr][__send__(attr)]
      end

      labels.each do |label|
        define_method :"#{attr}_#{label}" do
          self.class.labelized[attr][__send__(attr)][label]
        end
      end
    end
    def labelized
      model = model_name.i18n_key
      @labelized ||= Hash.new{|h,attr|
        converters = @labelizer_converters && @labelizer_converters[attr.to_sym]
        h[attr] = Hash.new{|h,value|
          h[value] = Hash.new{|h,label|
            result = ::I18n.translate(
              "labelizer.#{model}.#{attr}.#{value}.#{label}",
              default: [
                :"labelizer.#{model}.#{attr}.#{label}",
                :"labelizer.#{model}.#{label}",
                :"labelizer.#{label}",
                value,
              ],
              raise: true,
            ) rescue value
            if converter = converters && converters[label.to_sym]
              result = converter[result]
            end
            h[value] = result
          }
        }
      }
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
labelizer-0.0.2 lib/labelizer.rb