attr_accessor默认值

时间:2011-07-16 05:07:52

标签: ruby-on-rails ruby attr-accessor

我正在使用rails,我想这样做,以便attr_accessor :politics默认设置为false。

有谁知道如何做到这一点,能够用简单的术语解释一下吗?

7 个答案:

答案 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

底线是在迁移中设置默认属性。

希望这有帮助!

编辑:

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

herehere

答案 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)

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>

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