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值…