Рубин Виртус драгоценный камень против 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, у вас есть очень мощная альтернатива вложенным формам.

Другие вопросы по тегам