2017-05-15 1 views
7

Lassen Sie uns sagen, ich habe ein Virtus Modell User mit einem boolean-Attribut active:Verwenden Boolesche Attribut Methoden Helfer, wenn sie von Virtus.model on the fly erstreckt

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

Dann könnte ich Benutzer eine Hilfsmethode active?:

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

Aber wenn ich versuche zu extend von Virtus.model und eine boolesche Attribut on the fly definieren:

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

und verwenden Sie eine Hilfsmethode active? Ich bekomme eine NoMethodError ein bisschen Ausnahme.

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

Gibt es eine Möglichkeit, Hilfsmethoden in dieser Situation zu verwenden?

+0

ist 'user.active' auch geben Fehler? Ich meine ohne "?" –

+0

@ Md.FarhanMemon, kein 'user.active' funktioniert gut. Es ist nur so, dass die Verwendung von 'active?' Auf diese Weise viel deutlicher aussieht und sich nicht von anderen booleschen Logikprüfungen in der Anwendung unterscheidet. – potashin

+0

Ich sehe, was ist der volle Fehler btw? 'undefinierte Methode' aktiv? ' für .....? ' –

Antwort

5

Wahrscheinlich gibt es ein weiteres Juwel in Ihrem Projekt, das eine Klasse definiert und es mit den Booleschen Attributmethoden kollidiert. Mongoid zum Beispiel ist known, um das zu tun. In diesem Fall verwendet der Virtus README suggests stattdessen den Axiom::Types::Boolean Typ des Attributs.

Wenn ich dies jedoch versuchte, half es nicht. Ich glaube, die README ist eigentlich falsch, der richtige Typ wird in der Issue #234 comment: Virtus::Attribute::Boolean notiert.

Ein komplettes Arbeitsbeispiel:

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