Sha256: 2ae41738f3bf0db6070a248ee8f5dae22845d548b18676e9b6a040da9eb39a70

Contents?: true

Size: 1.08 KB

Versions: 1

Compression:

Stored size: 1.08 KB

Contents

module MissileEmitter
  module Configurable

    # 配置项列表(klass => [key1, key2, ...])
    # eg. {Setting => [:logo, :copyright, ...]}
    option_names = {}
    
    MissileEmitter do |klass, key_field = :key, value_field = :value, key, &default|
      (option_names[klass] ||= [].to_set) << key

      klass.define_singleton_method key do |&writer|
        setting = find_or_initialize_by key_field => key

        value = setting.send value_field

        if setting.new_record? # 记录不存在
          value = setting.instance_exec &(writer || default || -> { value })
        else
          value = setting.instance_exec &writer if writer
        end

        setting.attributes = {value_field => value}

        setting.save!

        value
      end
    end

    extend ActiveSupport::Concern

    included do
      # 获取所有配置:Klass.options ---> {logo: '', copyright: '', ...}
      define_singleton_method :options do
        option_names.fetch(self, []).each_with_object({}) do |key, result|
          result[key] = send key
        end
      end
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
missile_emitter-0.3.9 lib/missile_emitter/configurable.rb