我正在使用rails,我想将其attr_accessor :politics
设置为默认设置为false。
有谁知道如何做到这一点并且能够为我简单地解释它?
我正在使用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
就这样
更新
attr_accessor_with_default在 Rails 3.2 中已被弃用。你可以用纯 Ruby 来代替
class Like
attr_writer :politics
def politics
@politics || false
end
end
i = Like.new
i.politics #=> false
如果您定义您的attr_accessor
,则默认值为nil
。你可以给它写信,从而使它!nil
您可以使用 virtus gem:
https://github.com/solnic/virtus
从自述文件:
Virtus 允许您使用有关类型、读取器/写入器方法可见性和强制行为的可选信息来定义类、模块或类实例的属性。它支持嵌入对象和集合的许多强制和高级映射。
它特别支持默认值。
class Song < ActiveRecord::Base
def initialize(*args)
super(*args)
return unless self.new_record?
self.play_count ||= 0
end
end
在我看来,我认为这个答案很好。虽然我们重写了该initialize()
方法,但是由于在该方法的第一行调用了 super,它并没有改变基类initialize()
方法的任何内容,而是面向对象编程的一个关键特性,我们可以重写它,并添加一些在初始化对象时提供更多功能。并且在从数据库读取对象时也不会跳过初始化程序,因为super
在函数的第一行调用。
我一直在 ActiveRecord 中使用这种形式:
class Song < ActiveRecord::Base
def initialize(*args)
super(*args)
return unless self.new_record?
self.play_count ||= 0
end
end
rails 中的 attr_accessor 只是不存储在数据库中的虚拟变量,它只能在活动记录不保存或更新应用程序之前使用。您可以在模型中定义 attr_accessor
class Contact < ActiveRecord::Base
attr_accessor :virtual_variable
end
并以如下形式使用:-
<div class="field">
<%= f.label :virtual %><br>
<%= f.text_field :virtual %>
</div>
你可以在控制器参数中找到这些虚拟变量值......