Ruby on rails 修补枚举\u混合用于rails的gem>=3.2.8

Ruby on rails 修补枚举\u混合用于rails的gem>=3.2.8,ruby-on-rails,ruby,gem,enumeration,rails,gemfile,github,pull-request,Ruby On Rails,Ruby,Gem,Enumeration,Rails,Gemfile,Github,Pull Request,取决于 修补它的正确方法是什么?在本地克隆的repo,并在您的项目中将其用作本地gem的路径。因此,请在中指定: gem :enumerations_mixin, :path => '/local/path/to/gem' 当您将要修补gem时,将其分叉,在/local/path/to/gem/.git/config中替换gem origin,将更改推到分叉,并将中的该行替换到以下位置: gem :enumerations_mixin, :github => 'your_acoo

取决于

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

在本地克隆的repo,并在您的项目中将其用作本地gem的路径。因此,请在中指定:

gem :enumerations_mixin, :path => '/local/path/to/gem'
当您将要修补gem时,将其分叉,在/local/path/to/gem/.git/config中替换gem origin,将更改推到分叉,并将中的该行替换到以下位置:

gem :enumerations_mixin, :github => 'your_acoount/enumerations_mixin'
gem :enumerations_mixin, :github => 'protocool/enumerations_mixin'
向gem的根回购发出请求,当请求被接受时,将中的该行替换为以下内容:

gem :enumerations_mixin, :github => 'your_acoount/enumerations_mixin'
gem :enumerations_mixin, :github => 'protocool/enumerations_mixin'
gem发布后,该行可以替换为:

gem :enumerations_mixin, '~> <new_verison>'
gem:enumerations\u mixin,~>'

恐怕要打很多补丁了。此方法已被
class_属性
取代,但其工作原理略有不同。以前使用
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\u inheritable\u attribute(:attribute\u name)
就可以了

唯一的问题是,如果未设置属性,“read_inheritable_attribute”返回nil,并且上述方法将抛出错误。您会注意到,所有读取方法都有默认值,如(第56行):

您需要查找所有这些默认值,并在acts as enumerated方法中强制执行它们:

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
def作为枚举(options={})
有效的_键=[:条件,:顺序,:查找失败时]
默认_选项={}
选项=默认选项。合并选项
选项。断言有效密钥(*有效密钥)
有效的|键。每个do |键|
如果options.has\u key,则写入可继承的属性(“acts_enumerated_35;{key.to_s}”。to_sym,options[key])?钥匙
结束
然而,这不是一个完美的设计。我可能会在append\u features方法中定义
class\u attribute enumerated\u options
,将所有选项作为散列放在那里,而不是为每个选项创建class\u属性。这完全取决于你


另外请注意,这个gem已经写了4年多了,而且这个方法可能不是唯一一个被弃用的方法。我不完全确定这个gem应该做什么,但是实现您需要的东西可能比使用它更容易。

kk。。。重新表述问题:如何替换read_inheritable_属性的用法?我真的不明白它的意思。我找到了一个简单的方法:是的,那将是最简单的方法,但是我从来没有喜欢过这种解决方案。随着框架的发展,我们不应该强迫它使用旧模式,因为有很好的理由将它们删除。不过,作为一个临时解决方案,这是可以的。