Значения по умолчанию для attr_accessor - PullRequest
52 голосов
/ 16 июля 2011

Я использую рельсы и хочу сделать так, чтобы по умолчанию для attr_accessor :politics было установлено значение false.

Кто-нибудь знает, как это сделать, и может объяснить это в простых терминах?для меня?

Ответы [ 7 ]

116 голосов
/ 08 января 2012

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
0 голосов
/ 27 декабря 2016

Вы можете использовать камень добродетели:

https://github.com/solnic/virtus

от README:

Virtus позволяет вам определять атрибуты классов, модулей или экземпляров классов с дополнительной информацией о типах, видимости метода чтения / записи и поведения приведения. Он поддерживает множество принуждений и расширенное отображение вложенных объектов и коллекций.

Специально поддерживает значения по умолчанию .

0 голосов
/ 20 марта 2015

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>

и вы можете найти значение этой переменной в параметре контроллера ...

0 голосов
/ 15 января 2013
class Song < ActiveRecord::Base
    def initialize(*args)
    super(*args)
      return unless self.new_record?
      self.play_count ||= 0
    end
end

По-моему, я думаю, что этот ответ хороший. Хотя мы переопределяем метод initialize, но так как super вызывается в первой строке этого метода, он ничего не изменил на метод инициализации базового класса, скорее это ключевая особенность объектно-ориентированного программирования, которую мы можем переопределить и добавить некоторые. больше функциональности во время инициализации объектов. И также инициализатор не будет пропущен при чтении объектов из базы данных, так как super вызывается в первой строке функции.

0 голосов
/ 23 мая 2012

Я использовал эту форму в ActiveRecord:

class Song < ActiveRecord::Base

    def initialize(*args)
      super(*args)
      return unless self.new_record?
      self.play_count ||= 0
    end
end
0 голосов
/ 18 апреля 2012

Если вы определяете свой attr_accessor, по умолчанию значение равно nil. Вы можете написать ему, тем самым сделав его !nil

0 голосов
/ 16 июля 2011

Это не делается в attr_accessor, скорее, в вашей миграции.

Итак .. вы можете выполнить миграцию

(1) rails g migration ChangePoliticsColumnToDefaultValueFalse

(2) добавить это в def self.up

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

Суть в том, что атрибуты по умолчанию задаются в миграциях.

Надеюсь, это поможет!

Edit:

Есть также несколько похожих вопросов, на которые были даны хорошие ответы:

Как здесь и здесь

...