ruby attr_accessor默认值

2j4z5cfb  于 2023-08-04  发布在  Ruby
关注(0)|答案(7)|浏览(89)

我正在使用rails,我想让它默认设置为false。
有谁知道如何做到这一点,并能够解释它在简单的条款给我吗?

rbpvctlc

rbpvctlc1#

Rails 4+

class Like
  def after_initialize
    self.politics = false
  end
end

i = Like.new
i.politics #=> false

字符串

Rails 3.1及以下版本

class Like
  attr_accessor_with_default :politics, false
end

i = Like.new
i.politics #=> false

纯Ruby

class Like
  attr_writer :politics
      
  def politics
    @politics || false
  end
end

i = Like.new
i.politics #=> false

ac1kyiln

ac1kyiln2#

如果定义了attr_accessor,默认值为nil。您可以向其写入,从而使其成为!nil

des4xlb0

des4xlb03#

你可以使用virtus gem:
https://github.com/solnic/virtus
来自README:
Virtus允许你在类、模块或类示例上定义属性,其中包含关于类型、读/写方法可见性和强制行为的可选信息。它支持大量的强制和嵌入对象和集合的高级Map。
它特别支持默认值。

wgxvkvu9

wgxvkvu94#

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

字符串
在我看来,我认为这个答案是好的。虽然我们覆盖了initialize()方法,但由于super是在该方法的第一行调用的,它不会改变基类initialize()方法的任何内容,相反,这是面向对象编程的一个关键特性,我们可以覆盖它,并在对象初始化时添加更多功能。从数据库阅读对象时也不会跳过初始化器,因为super是在函数的第一行调用的。

ix0qys7i

ix0qys7i5#

我在ActiveRecord中使用了这个表单:

class Song < ActiveRecord::Base

    def initialize(*args)
      super(*args)
      return unless self.new_record?
      self.play_count ||= 0
    end
end

字符串

5jdjgkvh

5jdjgkvh6#

这不是在attr_accessor中完成的,而是在迁移中完成的。
因此。。您可以执行迁移
(1)第一个月
(2)在def self.up中添加
def self.up change_column :your_table, :politics, :boolean, :default => 0 end
底线是默认属性在迁移中设置。
希望这对你有帮助!
编辑:
还有一些类似的问题也得到了很好的回答:
例如herehere

lg40wkob

lg40wkob7#

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>


你可以在控制器参数中找到这些变量值。

相关问题