ruby on rails - Usa i metodi boolean helper per gli attributi quando estendi da Virtus.model al volo



ruby-on-rails ruby-on-rails-4 (1)

Diciamo che ho un User modello Virtus con un attributo booleano active :

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

Quindi potrei usare un metodo di aiuto active? :

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

Ma quando provo ad extend da Virtus.model e definire un attributo booleano al volo:

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

e utilizzare un metodo di supporto active? NoMethodError un'eccezione NoMethodError kinda.

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

C'è qualche possibilità di usare metodi di supporto in questa situazione?


Molto probabilmente c'è un'altra gemma nel tuo progetto che definisce una classe Boolean primo livello e si scontra con i metodi degli attributi booleani. Il mongolo, ad esempio, è noto per farlo. In tal caso, il Virtus README suggerisce di utilizzare invece il tipo Axiom::Types::Boolean dell'attributo.

Tuttavia, quando ho provato questo, non ha aiutato. Credo che il README sia in realtà sbagliato, il tipo corretto è stato notato nel commento numero 234 : Virtus::Attribute::Boolean .

Un esempio operativo completo:

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