0

サード パーティの API から JSON データを使用し、そのデータを少し処理してから、モデルを JSON としてクライアントに送信しています。着信データのキーは、あまり適切に命名されていません。それらのいくつかは頭字語であり、いくつかはランダムな文字のようです. 例えば:

{
  aikd: "some value"
  lrdf: 1 // I guess this is the ID
}

このリソースをラップする Rails ActiveResource モデルを作成していますが、lrdf が実際に何であるかが明らかでないため、model.lrdf を介してこれらのプロパティにアクセスしたくありません! 代わりに、これらのプロパティをより適切な名前の別のプロパティにエイリアスする何らかの方法が必要です。model.id = 1 と言って lrdf を自動的に 1 に設定したり、model.id を設定して自動的に 1 を返したりできるようにするための何か。また、model.to_json を呼び出してモデルをクライアントに送信するときに、私の JavaScript は、これらの奇妙な命名規則を理解する必要があります。

私は試した

alias id lrdf

しかし、メソッド lrdf が存在しないというエラーが表示されました。

もう 1 つのオプションは、プロパティをラップすることです。

def id
  lrdf
end

これは機能しますが、model.to_json を呼び出すと、lrdf がキーとして再び表示されます。

誰かが前にこのようなことをしたことがありますか? おすすめは何ですか?

4

2 に答える 2

1

before_save マジックを試してみましたか? おそらく、attr_accessible :ldrf を定義してから、before_save フィルターで id フィールドに ldrf を割り当てることができます。試したことはありませんが、うまくいくはずだと思います。

attr_accessible :ldrf

before_save :map_attributes

protected
  def map_attributes
    {:ldrf=>:id}.each do |key, value|
      self.send("#{value}=", self.send(key))
    end
  end

お知らせ下さい!

于 2011-04-13T20:29:10.413 に答える
0

ActiveResource :: Formats :: JsonFormatに基づいてフォーマッターモジュールを作成し、decode()をオーバーライドしてみてください。データを更新する必要がある場合は、encode()もオーバーライドする必要があります。ローカルのgems/activeresource-NNN / lib / active_resource / formats / json_format.rbを見て、元のjsonフォーマッターが何をするかを確認してください。

モデルの名前がModelで、フォーマッターがCleanupFormatterの場合は、Model.format=CleanupFormatterを実行します。

module CleanupFormatter
  include ::ActiveResource::Formats::JsonFormat
  extend self
  # Set a constant for the mapping.
  # I'm pretty sure these should be strings. If not, try symbols.
  MAP = [['lrdf', 'id']]

  def decode(json)
    orig_hash = super
    new_hash = {}
    MAP.each {|old_name, new_name| new_hash[new_name] = orig_hash.delete(old_name) }
    # Comment the next line if you don't want to carry over fields missing from MAP
    new_hash.merge!(orig_hash)
    new_hash
  end
end

これには、あなたが尋ねたようなエイリアシングは含まれませんが、元の名前が存在することを知る必要がないモデルから、ぎこちない名前を分離するのに役立つと思います。また、「to_json」は読み取り可能な名前を表示します。

于 2011-04-14T06:36:20.143 に答える