在从Virtus.model中动态扩展时使用布尔属性帮助器方法

时间:2017-05-15 10:25:19

标签: ruby-on-rails ruby ruby-on-rails-4 boolean virtus

假设我有一个带有布尔属性User的Virtus模型active

class User
  include Virtus.model 
  attribute :active, Boolean, default: false, lazy: true
end

然后我可以使用辅助方法active?

User.new.active? # => false
User.new(active: true).active? # => true

但是当我从extend尝试Virtus.model并动态定义布尔属性时:

class User; end
user = User.new
user.extend(Virtus.model)
user.attribute(:active, Axiom::Types::Boolean, default: false, lazy: true)
user.active = true

并使用辅助方法active?我得到NoMethodError有点异常。

user.active? # => NoMethodError: undefined method `active?' for

在这种情况下是否有可能使用辅助方法?

1 个答案:

答案 0 :(得分:5)

项目中很可能还有另一个gem 定义了顶级Boolean,并且它与布尔属性方法发生冲突。例如,Mongoid就是known来做到这一点。在这种情况下,Virtus README suggests使用Axiom::Types::Boolean类型的属性代替。

然而,当我尝试这个时,它没有帮助。我认为README实际上是错误的,Issue #234 comment中注明了正确的类型: Virtus::Attribute::Boolean

一个完整的工作示例:

class User; end
user = User.new
user.extend(Virtus.model)
user.attribute(:active, 
               Virtus::Attribute::Boolean,   # <- note the type
               default: false, lazy: true)
user.active = true
user.active?
#=> true