7

假设我有一个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

但是当我尝试动态定义一个布尔属性时extendVirtus.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

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

4

1 回答 1

5

很可能您的项目中有另一个 gem定义了一个顶级Boolean,它与布尔属性方法发生冲突。例如,众所周知,Mongoid 就是这样做的。在这种情况下,Virtus README 建议改用Axiom::Types::Boolean属性的类型。

但是,当我尝试这样做时,它没有帮助。我相信自述文件实际上是错误的,在问题 #234 评论中指出了正确的类型: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 
于 2017-05-15T20:34:11.307 回答