jfo*_*erg 4 ruby ruby-on-rails mixins
在我的Rails项目,我存储在一个字符串索引的散列结果,其中每一类(模型)有它自己的设置一个"命名空间"全局设置.例如,新闻模型可能具有"news.stories_per_page"或"news.show_date"设置.
为了避免到处乱序,我有一个mixin,它提供了访问这些设置的通用类方法.使用这个mixin,我可以使用以下代码访问'news.show_date':
News.setting :show_date
=> true
Run Code Online (Sandbox Code Playgroud)
现在,这是问题所在.为了生成字符串"news.show_date",我需要知道我的混合模块中,但一类方法中的模型的类名,
self.class
=> Class
Run Code Online (Sandbox Code Playgroud)
这对我没有多大帮助.在我天真的实现中,这导致所有模型将他们的设置存储在"类"下.命名空间,这是不可接受的.
我为无法更清楚地陈述问题而道歉.我对Ruby有点新,并且没有完全理解它的对象模型.这个问题可能与kludge有关,而Ruby似乎需要在类方法中混合使用.
类的名称是类的名称name:
module Foo
def whoami
self.name
end
end
class Bar
extend Foo
end
p Bar.whoami #=> "Bar"
Run Code Online (Sandbox Code Playgroud)
我不会创建一些字符串; 我会为每个类创建一个新的设置哈希:
module Settings
def setting(name,value=:GIT_DA_VALUE)
@_class_settings ||= {} # Create a new hash on this object, if needed
if value==:GIT_DA_VALUE
@_class_settings[name]
else
@_class_settings[name] = value
end
end
end
class Foo
extend Settings
end
class Bar
extend Settings
end
Foo.setting(:a,42)
p Foo.setting(:a), #=> 42
Foo.setting(:b), #=> nil
Bar.setting(:a) #=> nil (showing that settings are per class)
Run Code Online (Sandbox Code Playgroud)
...或者我会通过类对象本身索引单个全局哈希(如果需要):
module Settings
# A single two-level hash for all settings, indexed by the object
# upon which the settings are applied; automatically creates
# a new settings hash for each object when a new object is peeked at
SETTINGS = Hash.new{ |h,obj| h[obj]={} }
def setting(name,value=:GIT_DA_VALUE)
if value==:GIT_DA_VALUE
SETTINGS[self][name]
else
SETTINGS[self][name] = value
end
end
end
# Usage is the same as the above; settings are unique per class
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1214 次 |
| 最近记录: |