Рубин Виртус драгоценный камень против attr_accessor
Я смотрю на драгоценный камень Virtus, используемый в нескольких уроках об объекте Service в Ruby. На странице github https://github.com/solnic/virtus приведен следующий пример.
Использование 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 и что он делает в несколько строк, что бы это было?
1 ответ
Цели Virtus можно суммировать как попытку сделать атрибуты немного более "Rails-y". Они обеспечивают поддержку синтаксического анализа формы /JSON, инкапсуляцию при сохранении информации о типе и некоторые другие вещи, которые невозможно получить с помощью обычных атрибутов, но также не так просто.
Однако настоящие преимущества приходят, когда вы объединяете Virtus с ActiveModel::Validations
за этот пост. Поскольку ваши базовые значения стали более чуткими к ожиданиям помощников форм Rails, у вас есть очень мощная альтернатива вложенным формам.