2017-05-15 20 views
7

Hãy nói rằng tôi có một mô hình Virtus User với một thuộc tính boolean active:Sử dụng thuộc tính boolean phương pháp helper khi kéo dài từ Virtus.model on the fly

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

Sau đó, tôi có thể sử dụng một phương pháp helper active?:

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

Nhưng khi tôi cố gắng extend từ Virtus.model và xác định thuộc tính boolean khi đang bay:

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

và sử dụng phương thức trợ giúp active? Tôi nhận được một ngoại lệ là NoMethodError.

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

Có khả năng sử dụng các phương pháp trợ giúp trong trường hợp này không?

+0

là 'user.active' cũng được đưa ra lỗi? Ý tôi là không có '? ' –

+0

@ Md.FarhanMemon, không có' user.active' nào hoạt động tốt. Nó chỉ là bằng cách sử dụng 'hoạt động?' Trông rất nhiều khác biệt trong cách đó và không khác với kiểm tra logic boolean khác trong ứng dụng. – potashin

+0

Tôi hiểu, lỗi btw đầy đủ là gì? 'phương thức undefined' active? ' cho .....? ' –

Trả lời

5

Hầu hết có thể có một đá quý khác trong dự án của bạn là định nghĩa một lớp hàng đầu Boolean lớp và nó xung đột với các phương thức thuộc tính Boolean. Mongoid, ví dụ, là known để làm điều đó. Trong trường hợp này, thay vào đó, hãy sử dụng loại thay vào đó là loại Axiom::Types::Boolean.

Tuy nhiên, khi tôi thử điều này, nó không giúp ích gì. Tôi tin rằng README thực sự là sai, loại chính xác được ghi chú trong Issue #234 comment: Virtus::Attribute::Boolean.

Một hoàn chỉnh ví dụ làm việc:

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 
Các vấn đề liên quan