答案 0 :(得分:1)
我害怕相当多的补丁。此方法已被class_attribute
取代,但它的工作方式略有不同。以前使用write_inheritable_attribute
创建新的类参数就足够了,现在需要先声明它然后再赋值。
在第17行,它使用'write_inheritable_attribute`来设置这些值。现在应该阅读
class_attribute :"acts_enumerated_#{key}" unless respond_to? "acts_enumerated_#{key}"
self.send(:"acts_enumerated_#{key}=", options[key])
然后,在使用read_inheritable_attribute(:attribute_name)
的任何地方,只需使用self.attribute_name
。
唯一的问题是'read_inheritable_attribute`如果未设置属性则返回nil,并且上面的方法将引发错误。您会注意到所有读取方法都有默认值,如(第56行):
read_inheritable_attribute(:acts_enumerated_on_lookup_failure) || :enforce_strict_literals
您需要查找所有这些默认值并在行为中强制执行它们作为枚举方法:
def acts_as_enumerated(options = {})
valid_keys = [:conditions, :order, :on_lookup_failure]
default_options = {<all the default values from the code>}
options = default_options.merge options
options.assert_valid_keys(*valid_keys)
valid_keys.each do |key|
write_inheritable_attribute("acts_enumerated_#{key.to_s}".to_sym, options[key]) if options.has_key? key
end
然而,这不是一个完美的设计。我可能会在append_features方法中定义class_attribute enumerated_options
,将所有选项放在哈希中,而不是为每个选项创建class_attribute。这绝对取决于你。
另请注意,这个gem已经写了4年多了,而且这个方法可能不是唯一被弃用的方法。我不完全确定这个宝石应该做什么,但是可能更容易实现你需要的而不是使用它。
答案 1 :(得分:0)
在本地克隆gem的repo,并在rails项目中将其用作本地gem的路径。请在 gemfile :
中指定gem :enumerations_mixin, :path => '/local/path/to/gem'
如果您要修补宝石,请将其分叉到github,替换 /local/path/to/gem/.git/config 中的宝石来源,将更改推送到您的宝石fork,并将 gemfile 中的该行替换为follownig:
gem :enumerations_mixin, :github => 'your_acoount/enumerations_mixin'
将pull-request发给gem的根目录,当接受请求时,将 gemfile 中的该行替换为follownig:
gem :enumerations_mixin, :github => 'protocool/enumerations_mixin'
当宝石被释放后,该线可以替换为:
gem :enumerations_mixin, '~> <new_verison>'