假设我有一个具有布尔属性的Virtus模型User:
class User include Virtus.model attribute :active,Boolean,default: false,lazy: true end
然后我可以使用辅助方法激活吗?:
User.new.active? # => false User.new(active: true).active? # => true
但是当我尝试从Virtus.model扩展并动态定义一个布尔属性时:
class User; end user = User.new user.extend(Virtus.model) user.attribute(:active,Axiom::Types::Boolean,lazy: true) user.active = true
并使用辅助方法激活?我得到一个NoMethodError有点例外.
user.active? # => NoMethodError: undefined method `active?' for
在这种情况下是否有可能使用辅助方法?
解决方法
很可能在您的项目中有另一个gem定义了顶级布尔类,并且它与布尔属性方法冲突.例如,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