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

pot*_*hin 7 ruby boolean ruby-on-rails ruby-on-rails-4 virtus

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

class User
  include Virtus.model 
  attribute :active, Boolean, default: false, lazy: true
end
Run Code Online (Sandbox Code Playgroud)

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

User.new.active? # => false
User.new(active: true).active? # => true
Run Code Online (Sandbox Code Playgroud)

但是当我尝试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
Run Code Online (Sandbox Code Playgroud)

并使用帮助器方法active?我得到一个NoMethodError例外.

user.active? # => NoMethodError: undefined method `active?' for
Run Code Online (Sandbox Code Playgroud)

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

Bor*_*aMa 5

很可能你的项目中有另一个gem 定义了一个顶级Boolean,它与Boolean属性方法冲突.Mongoid,例如,被称为做到这一点.在这种情况下,Virtus README建议使用Axiom::Types::Boolean属性的类型.

但是,当我尝试这个时,它没有帮助.我认为README实际上是错误的,问题#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 
Run Code Online (Sandbox Code Playgroud)