新手,最近在看 ruby-china 的代码,看到了关于站点默认设置的 Siteconfig 类哪里有一点小问题,求教。 代码在这里
# coding: utf-8
# 在数据库中的配置信息
# 这里有存放首页,Wiki 等页面 HTML
# 使用方法
# SiteConfig.foo
# SiteConfig.foo = "asdkglaksdg"
class SiteConfig
include Mongoid::Document
field :key
field :value
index :key
validates_presence_of :key
validates_uniqueness_of :key
def self.method_missing(method, *args)
method_name = method.to_s
super(method, *args)
rescue NoMethodError
if method_name =~ /=$/
var_name = method_name.gsub('=', '')
value = args.first.to_s
# save
if item = find_by_key(var_name)
item.update_attribute(:value, value)
else
SiteConfig.create(:key => var_name, :value => value)
end
else
Rails.cache.fetch("site_config:#{method}") do
if item = where(:key => method).first
item.value
else
nil
end
end
end
end
after_save :expire_cache
def expire_cache
Rails.cache.write("site_config:#{self.key}", self.value)
end
def self.find_by_key(key)
where(:key => key.to_s).first
end
def self.save_default(key, value)
if not find_by_key(key)
create(:key => key, :value => value.to_s)
end
end
end
1.这里的 self.method_missing 方法中的 的 super(method, *args) 是做什么用的呢,SiteConfig 的 supperclass 是什么? 2.
Rails.cache.fetch("site_config:#{method}") do
if item = where(:key => method).first
item.value
else
nil
end
end
这里为什么不直接返回 Rails.cache.fetch("site_config:#{method}") 呢,后面的 block 是做什么的呢? 3。
if item = where(:key => method).first
这句为什么使用 method 呢,我看保存的时候都是用 to_s 方法之后字符串,不应该用 method_name 或者 method.to_s 么?