Sha256: e8fc0561facd27945822c21a289caa9a486f853711ea73d8d70f329143857b9a
Contents?: true
Size: 1.18 KB
Versions: 2
Compression:
Stored size: 1.18 KB
Contents
require 'set' module MissileEmitter module Configurable # 配置项列表(klass => [key1, key2, ...]) # eg. {Setting => [:logo, :copyright, ...]} mapping = {} MissileEmitter do |klass, key_field = :key, value_field = :value, key, &default| (mapping[klass] ||= [].to_set) << key define_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 # 获取所有配置项名称:Klass.option_names ---> [:logo, copyright, ...] define_singleton_method :option_names_for do |klass| mapping.fetch klass, [] end # 获取所有配置:Klass.options ---> {logo: '', copyright: '', ...} define_singleton_method :options_for do |klass| option_names_for(klass).each_with_object({}) do |key, result| result[key] = klass.send key end end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
missile_emitter-0.3.17 | lib/missile_emitter/configurable.rb |
missile_emitter-0.3.16 | lib/missile_emitter/configurable.rb |