attr_accessor默认值

我正在使用rails,我想这样做,以便attr_accessor :politics默认设置为false。

有谁知道如何做到这一点,并能为我解释简单的条款?

Rails有attr_accessor_with_default,所以你可以写

 class Like attr_accessor_with_default :politics,false end i = Like.new i.politics #=> false 

就这样

UPDATE

在Rails 3.2中已经废弃了attr_accessor_with_default ..你可以用纯Ruby来代替它

 class Like attr_writer :politics def politics @politics || false end end i = Like.new i.politics #=> false 

如果你定义你的attr_accessor,默认值是nil 。 你可以写信给它,从而使它!nil

 class Song < ActiveRecord::Base def initialize(*args) super(*args) return unless self.new_record? self.play_count ||= 0 end end 

在我看来,我觉得这个答案很好。 尽pipe我们重写了初始化方法,但是因为这个方法的第一行调用了super,所以它并没有改变任何基类的初始化方法,而这是面向对象编程的关键特性,我们可以覆盖它,并添加一些在对象初始化的时候有更多的function。 另外,在读取数据库中的对象时,初始化程序不会被跳过,因为在函数的第一行调用了super。

你可以使用virtusgem:

https://github.com/solnic/virtus

从自述文件:

Virtus允许您使用有关types,读写器方法可见性和强制行为的可选信息来定义类,模块或类实例的属性。 它支持很多强制和embedded对象和集合的高级映射。

它特别支持默认值 。

这不是在attr_accessor中完成的,而是在你的迁移中完成的。

所以..你可以执行一个迁移

(1) rails g migration ChangePoliticsColumnToDefaultValueFalse

(2)在def self.up添加这个

def self.up change_column :your_table, :politics, :boolean, :default => 0 end

底线是在迁移中设置默认属性。

希望这可以帮助!

编辑:

还有一些类似的问题也得到了很好的回答:

喜欢这里和这里

我一直在ActiveRecord中使用这种forms:

 class Song < ActiveRecord::Base def initialize(*args) super(*args) return unless self.new_record? self.play_count ||= 0 end end 

rails中的attr_accessor只是虚拟variables,不存储在数据库中,只能在应用程序中的活动logging不保存或更新之前使用。 你可以在模型中定义attr_accessor

 class Contact < ActiveRecord::Base attr_accessor :virtual_variable end 

并使用forms如:

  <div class="field"> <%= f.label :virtual %><br> <%= f.text_field :virtual %> </div> 

你可以在控制器参数中find这些vartualvariables值…

Interesting Posts