修补enumerations_mixin gem for rails> = 3.2.8

时间:2014-02-05 10:42:38

标签: ruby-on-rails ruby gem enumeration

enumerations_mixin gem取决于deprecated method

here's the guilty line

修补它的正确方法是什么?

2 个答案:

答案 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)

在本地克隆的repo,并在项目中将其用作本地gem的路径。请在

中指定
gem :enumerations_mixin, :path => '/local/path/to/gem'

如果您要修补宝石,请将其分叉到,替换 /local/path/to/gem/.git/config 中的宝石来源,将更改推送到您的宝石fork,并将 中的该行替换为follownig:

gem :enumerations_mixin, :github => 'your_acoount/enumerations_mixin'

发给gem的根目录,当接受请求时,将 中的该行替换为follownig:

gem :enumerations_mixin, :github => 'protocool/enumerations_mixin'

当宝石被释放后,该线可以替换为:

gem :enumerations_mixin, '~> <new_verison>'