Я использую рельсы, и я хочу сделать так, чтобы attr_accessor :politics
был установлен по умолчанию на false.
Кто-нибудь знает, как это сделать, и может объяснить это простыми словами для меня?
Я использую рельсы, и я хочу сделать так, чтобы attr_accessor :politics
был установлен по умолчанию на false.
Кто-нибудь знает, как это сделать, и может объяснить это простыми словами для меня?
Rails имеет attr_accessor_with_default, чтобы вы могли написать
class Like
attr_accessor_with_default :politics,false
end
i = Like.new
i.politics #=> false
и все это
UPDATE
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
Если вы определяете свой attr_accessor, по умолчанию значение nil
. Вы можете написать ему, тем самым сделав его !nil
class Song < ActiveRecord::Base
def initialize(*args)
super(*args)
return unless self.new_record?
self.play_count ||= 0
end
end
По-моему, я считаю, что этот ответ хорош. Хотя мы переопределяем метод initialize, но поскольку super вызывается в первой строке этого метода, он ничего не изменил для метода инициализации базового класса, скорее это ключевая особенность объектно-ориентированного программирования, которую мы можем переопределить, и добавить некоторые больше функциональности во время инициализации объектов. И также инициализатор не будет пропущен при чтении объектов из базы данных, так как super вызывается в первой строке функции.
Вы можете использовать жемчужину virtus:
https://github.com/solnic/virtus
Из README:
Virtus позволяет вам определять атрибуты на классах, модулях или экземплярах классов с дополнительной информацией о типах, видимостью чтения/записи метода и принудительностью. Он поддерживает множество принуждений и расширенное отображение встроенных объектов и коллекций.
Он специально поддерживает значения по умолчанию.
Это не выполняется в attr_accessor, скорее, при переносе.
Итак, вы можете выполнить миграцию
(1) rails g migration ChangePoliticsColumnToDefaultValueFalse
(2) добавить это в def self.up
def self.up change_column :your_table, :politics, :boolean, :default => 0 end
В нижней строке указано, что атрибуты по умолчанию задаются в миграциях.
Надеюсь, это поможет!
Edit:
Есть также похожие вопросы, на которые был дан ответ:
Я использую эту форму в ActiveRecord:
class Song < ActiveRecord::Base
def initialize(*args)
super(*args)
return unless self.new_record?
self.play_count ||= 0
end
end
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 переменной в параметре контроллера...