2016-09-20 73 views
2

我正在查看幾個關於Ruby中Service對象的教程中使用的Virtus Gem。在github頁面,https://github.com/solnic/virtus,它給出了下面的例子。Ruby的Virtus寶石與attr_accessor

使用了Virtus帶類

您可以創建擴展用了Virtus類及定義屬性:

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 

我可以看到的例子是如何工作的,但想知道這是怎麼不僅僅是定義不同attr_accessors在Ruby中?如果我必須向某人解釋,包括Virtus寶石的好處以及它在幾行中的作用,它會是什麼?

回答

2

Virtus的目標可以概括爲試圖使屬性更「Rails-y」。它們提供對解析表單/ JSON的支持,封裝while retaining type information以及其他一些事情,獲取常規屬性並不是不可能的,但也不容易。

但是,當您將Virtus與ActiveModel::Validations結合爲每this post時,真正的好處就出現了。由於您的基本值已經變得更加符合Rails窗體助手的期望,您可以選擇嵌套窗體。