2016-09-20 11 views
2

私は、RubyのServiceオブジェクトに関するいくつかのチュートリアルで使用されているVirtus gemを見ています。 githubページのhttps://github.com/solnic/virtusには、次の例があります。あなたはVirtus社で拡張するクラスを作成し、属性を定義することができますクラスRubyのVirtus gemとattr_accessor

とヴァータスを使用して

class User include Virtus.model 
    attribute :name, String 
    attribute :age, Integer 
    attribute :birthday, DateTime 
end 

user = User.new(:name => 'Piotr', :age => 31) user.attributes # => { :name => "Piotr", :age => 31, :birthday => nil } 

user.name # => "Piotr" 

user.age = '31' # => 31 user.age.class # => Fixnum 

user.birthday = 'November 18th, 1983' # => #<DateTime: 1983-11-18T00:00:00+00:00 (4891313/2,0/1,2299161)> 

# mass-assignment user.attributes = { :name => 'Jane', :age => 21 } user.name # => "Jane" user.age # => 21 

私は例がどのように動作するかを見ることができますが、これは単なる定義とは異なっているかを理解したいと思いますRubyのattr_accessors?私が誰かに説明しなければならないのであれば、Virtusの宝石を含めることのメリットとそれが何通りかの行で何をするのか、それは何でしょうか?

答えて

2

Virtusの目標は、属性をもう少し "Rails-y"にしようとしていると要約できます。これらは、フォーム/ JSONの解析、カプセル化while retaining type informationなどのサポートを提供しています。また、通常の属性を取得することも不可能ではありませんが、それほど簡単ではありません。

しかし、VirtusとActiveModel::Validationsとを組み合わせた場合、実際のメリットはthis postです。基本的な値はRailsフォームヘルパの期待に応えるようになったので、ネストされたフォームの代わりに非常に強力な方法があります。