attr_accessor 默认值

问题描述 投票:0回答:7

我正在使用 Rails,我想让

attr_accessor :politics
默认设置为 false。

有谁知道如何做到这一点并且能够为我简单地解释一下吗?

ruby-on-rails ruby attr-accessor
7个回答
157
投票

轨道 4+

class Like < ApplicationRecord
  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

纯红宝石

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

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

1
投票

如果您定义了

attr_accessor
,则默认值为
nil
。 您可以写入它,从而使其
!nil


-1
投票

你可以使用美德宝石:

https://github.com/solnic/virtus

来自自述文件:

Virtus 允许您使用有关类型、读取器/写入器方法可见性和强制行为的可选信息来定义类、模块或类实例的属性。它支持嵌入对象和集合的大量强制和高级映射。

它特别支持默认值


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

在我看来,我认为这个答案很好。虽然我们重写了

initialize()
方法,但由于 super 是在此方法的第一行调用的,因此它不会对基类
initialize()
方法进行任何更改,相反,这是面向对象编程的一个关键特征,我们可以覆盖它,并在对象初始化时添加更多功能。而且从数据库读取对象时也不会跳过初始化程序,因为
super
在函数的第一行被调用。


-5
投票

我一直在 ActiveRecord 中使用此表单:

class Song < ActiveRecord::Base

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

-6
投票

这不是在 attr_accessor 中完成的,而是在您的迁移中完成的。

所以..您可以执行迁移

(1)

rails g migration ChangePoliticsColumnToDefaultValueFalse

(2) 将此添加到

def self.up

def self.up change_column :your_table, :politics, :boolean, :default => 0  end

最重要的是,默认属性是在迁移中设置的。

希望这有帮助!

编辑:

也有一些类似的问题已经得到很好的回答:

就像这里这里


-7
投票
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>

您可以在控制器参数中找到这些虚拟变量值...

© www.soinside.com 2019 - 2024. All rights reserved.