Если вам необходимо повторно определять такие методы, определите модуль с именем AttrBoolean
:
module AttrBoolean
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def attr_boolean(*names)
names.each do |name|
define_method(:"#{name}=") do |value|
instance_variable_set(:"@#{name}", value)
end
define_method(:"#{name}?") do
!!instance_variable_get(:"@#{name}")
end
end
end
end
end
Вы можете использовать это следующим образом:
class Foo
include AttrBoolean
attr_boolean :server_error, :resolved
end
f = Foo.new
f.server_error = true
f.resolved = false
f.server_error? # => true
f.resolved? # => false
Обратите внимание, что методы получения без вопросительного знака не определены.
Выражение f.server_error
выдает исключение.