2014-02-05 31 views

回答

1

相当多的修补我的恐怕。这种方法已被class_attribute取代,但它的工作原理略有不同。以前它是足够使用write_inheritable_attribute创建新类PARAM,现在你需要首先声明,然后赋值。

在线路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`返回零。你会发现,所有的读取方法有默认值,如(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。这绝对取决于你。

另外请注意,这个宝石已被写入4年前,这种方法可能不是唯一被弃用的。我不完全知道这是什么宝石是应该做的,但它可能是更容易实现,而你需要什么,而不是使用它。

+0

我找到了一个简单的方法:http:// code。whowah.com/ruby/rubyonrails/bbclistenlive/vendor/rails/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb –

+0

是的,这将是最简单的方法,但我从来不喜欢这种解决方案。框架的演变,我们不应该强迫它使用旧模式,因为它们被删除的原因很充分。尽管可以作为临时解决方案。 – BroiSatse

0

的回购本地克隆,并在您的项目中用作本地宝石的路径。因此,指定您

gem :enumerations_mixin, :path => '/local/path/to/gem' 

当你将宝石修补,叉它,更换宝石产地在/local/path/to/gem/.git/config,把你的改变你的叉子,并替换该行于你的到follownig:

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

问题的创业板的根回购,当要求无线会被接受,取代线在你的到follownig:

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

当创业板将陆续公布线路可更换:

gem :enumerations_mixin, '~> <new_verison>' 
+0

kk ...改写问题:如何替换read_inheritable_attribute的使用情况?我真的不明白它的意义。 –