我正在使用rails,我想这样做,以便attr_accessor :politics
默认设置为false。
有谁知道如何做到这一点,能够用简单的术语解释一下吗?
答案 0 :(得分:116)
Rails有attr_accessor_with_default所以你可以写
class Like
attr_accessor_with_default :politics,false
end
i = Like.new
i.politics #=> false
那就是
<强>更新强>
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
答案 1 :(得分:0)
如果您定义了attr_accessor,则默认值为nil
。你可以写信给它,从而使它成为!nil
答案 2 :(得分:0)
你可以使用virtus gem:
https://github.com/solnic/virtus
来自自述文件:
Virtus允许您使用有关类型,读取器/写入器方法可见性和强制行为的可选信息在类,模块或类实例上定义属性。它支持嵌入式对象和集合的大量强制和高级映射。
它特别支持default values。
答案 3 :(得分:-1)
class Song < ActiveRecord::Base
def initialize(*args)
super(*args)
return unless self.new_record?
self.play_count ||= 0
end
end
在我看来,我觉得这个答案很好。虽然我们重写了initialize方法但是因为super在这个方法的第一行被调用,所以它没有改变任何基类初始化方法,而是这是面向对象编程的关键特性,我们可以覆盖它,并添加一些在初始化obect时的更多功能。并且在从数据库读取对象时也不会跳过初始化程序,因为在函数的第一行调用了super。
答案 4 :(得分:-3)
这不是在attr_accessor中完成的,而是在迁移中完成的。
所以......你可以进行迁移
(1)rails g migration ChangePoliticsColumnToDefaultValueFalse
(2)在def self.up
def self.up change_column :your_table, :politics, :boolean, :default => 0 end
底线是在迁移中设置默认属性。
希望这有帮助!
编辑:
也有一些类似的问题得到了很好的回答:
答案 5 :(得分:-3)
我一直在ActiveRecord中使用此表单:
class Song < ActiveRecord::Base
def initialize(*args)
super(*args)
return unless self.new_record?
self.play_count ||= 0
end
end
答案 6 :(得分:-4)
class Contact < ActiveRecord::Base
attr_accessor :virtual_variable
end
并使用以下形式: -
<div class="field">
<%= f.label :virtual %><br>
<%= f.text_field :virtual %>
</div>
你可以在控制器参数中找到这些vartual变量值...