2

Rails 3とActiveModelを使用しているので、自分自身を使用できません。ActiveModelベースのオブジェクト内の属性の値を取得するための構文。

次のコードでは、saveメソッドでself.first_nameはnilに評価され、@ attributes [:first_name]は'Firstname'(オブジェクトの初期化時にコントローラーから渡される値)に評価されます。

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
4

2 に答える 2

3

私はそれを考え出した。マリアンの答えへのコメントとして私が言及した「ハック」は、実際には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

于 2011-11-19T18:23:51.520 に答える
0

あなたはそれが必要ActiveModel::AttributeMethodsです

于 2011-09-30T18:22:37.280 に答える