config_manager.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:2k
源码类别:

Ajax

开发平台:

Others

  1. module ConfigManager
  2.   def self.append_features(base)
  3.     super
  4.     base.extend(ClassMethods)
  5.   end
  6.   module ClassMethods
  7.     def fields
  8.       @fields ||= Hash.new { Item.new }
  9.     end
  10.     def setting(name, type=:object, default=nil)
  11.       item = Item.new
  12.       item.name, item.ruby_type, item.default = name.to_s, type, default
  13.       fields[name.to_s] = item
  14.       add_setting_accessor(item)
  15.     end
  16.     def default_for(key)
  17.       fields[key.to_s].default
  18.     end
  19.     private
  20.     def add_setting_accessor(item)
  21.       add_setting_reader(item)
  22.       add_setting_writer(item)
  23.     end
  24.     def add_setting_reader(item)
  25.       self.send(:define_method, item.name) do
  26.         raw_value = settings[item.name]
  27.         raw_value.nil? ? item.default : raw_value
  28.       end
  29.       if item.ruby_type == :boolean
  30.         self.send(:define_method, item.name + "?") do
  31.           raw_value = settings[item.name]
  32.           raw_value.nil? ? item.default : raw_value
  33.         end
  34.       end
  35.     end
  36.     def add_setting_writer(item)
  37.       self.send(:define_method, "#{item.name}=") do |newvalue|
  38.         retval = settings[item.name] = canonicalize(item.name, newvalue)
  39.         self.save! unless new_record?
  40.         retval
  41.       end
  42.     end
  43.   end
  44.   def canonicalize(key, value)
  45.     self.class.fields[key.to_s].canonicalize(value)
  46.   end
  47.   class Item
  48.     attr_accessor :name, :ruby_type, :default
  49.     def canonicalize(value)
  50.       case ruby_type
  51.       when :boolean
  52.         case value
  53.         when "0", 0, '', false, "false", "f", nil
  54.           false
  55.         else
  56.           true
  57.         end
  58.       when :integer
  59.         value.to_i
  60.       when :string
  61.         value.to_s
  62.       when :yaml
  63.         value.to_yaml
  64.       else
  65.         value
  66.       end
  67.     end
  68.   end
  69. end