4

dbではなくサードパーティのAPIに接続しているため、ActiveModelを使用しています。ハッシュを渡してモデルの属性に変換できるように、独自のイニシャライザーを作成しました。これは、アプリケーションの一部のフォームをサポートするためです。

attr_accessor :Id, :FirstName, :LastName,...

def initialize(attributes = {})
  attributes.each do |name, value|
    send("#{name}=", value)
  end
end

問題は、APIからのデータ取得を処理するために同じモデルを使用したいということですが、これには私が本当に気にしない他のデータがたくさんあります。そのため、APIから返されたハッシュを反復処理し、属性がモデルに存在するかどうかを確認し、存在しない場合は無視します。これにより、フォームの投稿とAPIから返されるデータの両方に対して一貫したモデルを作成できるようになります。何かのようなもの:

def initialize(attributes = {})
  attributes.each do |name, value|
    if self.has_attribute?(name)
      send("#{name}=", value)
    end
  end
end

ActiveModel APIのドキュメントを調べましたが、同等のものはないようです。これは、私がこれを別の方法で行うべきであるかのように私を感じさせています。

これはこれを行うための正しい(レール)方法ですか?データがさまざまなソースから取得されている場合、一貫したモデル属性を確保するにはどうすればよいですか?

4

1 に答える 1

4

上記のコード例に基づくと、has_attribute?まったく同様のActiveModelメソッドを使用する必要はありません。単純に古いRubyにフォールバックできます。

def initialize(attributes = {})
  attributes.each do |name, value|
    send("#{name}=", value) if respond_to?("#{name}=")
  end
end

これは、属性がで開始されている場合にのみ属性を割り当てますattr_accessor

于 2011-06-06T12:28:52.603 に答える