如何在ruby中进行attr_accessor_with_default?

Dav*_*ers 19 ruby ruby-on-rails-3

attr_accessor_with_default在rails模型中使用的一些代码现在给我一个弃用警告,告诉我"使用Ruby代替!"

所以,想到可能有一个新的位ruby 1.9.2使得attr_accessor句柄默认,我用Google搜索,但我没有看到.我确实看到了一堆覆盖attr_accessor来处理默认值的方法.

当他们告诉我"使用Ruby?"时,这是什么意思?或者我现在应该写完整的getter/setter?还是有一些我找不到的新方法?

ste*_*lag 29

这个apidock页面建议在初始化方法中执行此操作.

class Something
  attr_accessor :pancakes

  def initialize 
    @pancakes = true
    super
  end
end
Run Code Online (Sandbox Code Playgroud)

super在使用ActiveRecord或类似设备时,请不要忘记打电话.

  • 顺便说一句:这应该是经过验证的答案,因为它没有任何依赖性. (2认同)

Pan*_*kaj 13

attr_accessor :pancakes

def after_initialize
     return unless new_record?
     self.pancakes = 11
end
Run Code Online (Sandbox Code Playgroud)

这可确保将值初始化为仅适用于新记录的某些默认值.

  • 这似乎取决于ActiveRecord.FYI为下一个人来. (16认同)

Joo*_*aij 5

由于您可能非常了解您的数据,因此假设nil不是有效值是完全可以接受的。

这意味着您可以取消after_initialize,因为这将为您创建的每个对象执行。正如一些人指出的那样,这对性能来说(可能)是灾难性的。此外,无论如何内联示例中的方法在 Rails 3.1 中已被弃用。

要“改用 Ruby”,我会采用这种方法:

attr_writer :pancakes

def pancakes
  return 12 if @pancakes.nil?
  @pancakes
end
Run Code Online (Sandbox Code Playgroud)

因此,稍微减少 Ruby 的魔力并编写您自己的 getter。毕竟,这正是您想要完成的事情,而且它非常好且简单,任何人都可以将他/她的头环绕起来。