我在rails模型中使用attr_accessor_with_default
的一些代码现在给了我一个弃用警告,告诉我“改用attr_accessor_with_default
!”
因此,考虑到ruby 1.9.2
中可能有一个新特性使attr_accessor
可以处理默认值,我搜索了一下,但我没有看到这一点。不过,我确实看到了一堆重写attr_accessor
来处理默认值的方法。
这就是他们告诉我“使用Ruby”的意思吗?或者我现在应该编写完整的getter/setter?还是有什么我找不到的新方法?
发布于 2012-01-19 05:51:07
This apidock page建议只在initialize方法中执行此操作。
class Something
attr_accessor :pancakes
def initialize
@pancakes = true
super
end
end
别忘了调用super
,特别是在使用ActiveRecord或类似的代码时。
发布于 2011-12-27 19:31:51
由于您可能非常了解您的数据,因此假设nil
不是有效值是完全可以接受的。
这意味着您可以取消after_initialize
,因为它将对您创建的每个对象执行。正如一些人指出的那样,这对性能(可能)是灾难性的。此外,在Rails 3.1中,无论如何都不推荐使用示例中的内联方法。
为了“改用Ruby”,我会采用这种方法:
attr_writer :pancakes
def pancakes
return 12 if @pancakes.nil?
@pancakes
end
所以,稍微修改一下Ruby的魔力,然后编写你自己的getter。毕竟,这正是你想要实现的目标,而且它足够好和简单,任何人都可以理解。
发布于 2014-07-18 01:27:33
这是一个古老的问题,但普遍的问题仍然出现-我发现自己在这里。
其他答案多种多样且有趣,但我在初始化数组时发现了所有这些答案的问题(特别是因为我希望能够在实例上调用initialize之前在类级别使用它们)。我在以下方面取得了成功:
attr_writer :pancakes
def pancakes
@pancakes ||= []
end
如果使用=而不是||=,您会发现<<操作符无法将第一个元素添加到数组中。(创建了一个匿名数组,并为其赋值,但从未将其赋值回@pancake。)
例如:
obj.pancakes
#=> []
obj.pancakes << 'foo'
#=> ['foo']
obj.pancakes
#=> []
#???#!%$#@%FRAK!!!
由于这是一个相当微妙的问题,可能会引起一些困惑,我认为在这里值得一提。
例如,如果您想要缺省为false,则需要为bool更改此模式:
attr_writer :pancakes
def pancakes
@pancakes.nil? ? @pancakes = false : @pancakes
end
尽管您可能会争辩说,在处理bool时,赋值并不是严格必要的。
https://stackoverflow.com/questions/7052509
复制相似问题