Поля ActiveModel не отображаются на средства доступа - PullRequest
2 голосов
/ 30 сентября 2011

Используя Rails 3 и ActiveModel, я не могу использовать self.синтаксис для получения значения атрибута внутри объекта на основе ActiveModel.

В следующем коде в методе сохранения self.first_name оценивается как ноль, где @attributes [: first_name] оценивается как «Имя» (значениепередается из контроллера при инициализации объекта).

В ActiveRecord это похоже на работу, но при построении того же класса в ActiveModel это не так.Как вы относитесь к полю, используя методы доступа в классе на основе ActiveModel?

class Card
  include ActiveModel::Validations
  extend ActiveModel::Naming 
  include ActiveModel::Conversion
  include ActiveModel::Serialization
  include ActiveModel::Serializers::Xml

  validates_presence_of :first_name

  def initialize(attributes = {})
    @attributes = attributes
  end

  #DWT TODO we need to make sure that the attributes initialize the accessors properyl, and in the same way they would if this was ActiveRecord
  attr_accessor :attributes, :first_name

  def read_attribute_for_validation(key)
    @attributes[key]
  end

  #save to the web service
  def save
    Rails.logger.info "self vs attribute:\n\t#{self.first_name}\t#{@attributes["first_name"]}"
  end

  ...

end

Ответы [ 2 ]

3 голосов
/ 19 ноября 2011

Я понял это. «Взлом», который я упомянул в качестве комментария к ответу Мариана, на самом деле оказался именно тем, как генерируются методы доступа для классов ActiveRecord. Вот что я сделал:

class MyModel
  include ActiveModel::AttributeMethods

  attribute_method_suffix  "="  # attr_writers
  attribute_method_suffix  ""   # attr_readers

  define_attribute_methods [:foo, :bar]

  # ActiveModel expects attributes to be stored in @attributes as a hash
  attr_reader :attributes

  private

  # simulate attribute writers from method_missing
  def attribute=(attr, value)
    @attributes[attr] = value
  end

  # simulate attribute readers from method_missing
  def attribute(attr)
    @attributes[attr]
  end
end

То же самое можно увидеть, если посмотреть в исходный код ActiveRecord (lib/active_record/attribute_methods/{read,write}.rb).

0 голосов
/ 30 сентября 2011

Вам нужно ActiveModel::AttributeMethods для этого

...