我正在使用 Rails,我想让
attr_accessor :politics
默认设置为 false。
有谁知道如何做到这一点并且能够为我简单地解释一下吗?
class Like < ApplicationRecord
def after_initialize
self.politics = false
end
end
i = Like.new
i.politics #=> false
class Like
attr_accessor_with_default :politics, false
end
i = Like.new
i.politics #=> false
class Like
attr_writer :politics
def politics
@politics || false
end
end
i = Like.new
i.politics #=> false
如果您定义了
attr_accessor
,则默认值为 nil
。 您可以写入它,从而使其!nil
你可以使用美德宝石:
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
class Contact < ActiveRecord::Base
attr_accessor :virtual_variable
end
并以如下形式使用:-
<div class="field">
<%= f.label :virtual %><br>
<%= f.text_field :virtual %>
</div>
您可以在控制器参数中找到这些虚拟变量值...