1

node() メソッドを使用して RABL で子ノードを作成した場合、表示される属性をどのように制御できますか?

JSON 出力は次のとおりです。

[
    {
        "location": {
            "latitude": 33333,
            "longitude": 44444,
            "address": "xxxxxxx",
            "title": "yyyy",
            "url": "http://www.google.com",
            "rate": {
                "created_at": "2012-09-02T11:13:13Z",
                "id": 1,
                "location_id": 1,
                "pair": "zzzzzz",
                "updated_at": "2012-09-02T12:55:28Z",
                "value": 1.5643
            }
        }
    }
]

created_at、updated_at、および location_id 属性を削除したいと考えています。

ビューファイルにこれがあります:

collection @locations
attributes :latitude, :longitude, :address, :title, :url
node (:rate) do   
  |location| location.rates.where(:pair => @pair).first
end

パーシャルと「拡張」メソッドを使用してみましたが、完全に台無しになりました。また、ブロックに属性を追加しようとしましたが、機能しませんでした (出力は属性で指定されたとおりでしたが、各属性の値は表示されませんでした)。

ありがとう!

4

2 に答える 2

2

attributes「self」がまだルートオブジェクトまたはコレクションであるため、ノードブロック内で使用することはできません@locationsRABL wiki: ヒントとコツ (子とノードを使用する場合)も参照してください。

ノード ブロックでは、関心のある属性のみをリストすることで、カスタム レスポンスを簡単に作成できます。

node :rate do |location|
  rate = location.rates.where(:pair => @pair).first
  {:id => rate.id, :location_id => rate.location_id, :value => rate.value}
end

パーシャルを使用してアプローチを試すこともできます。

app/views/rates/show.json.rabl

object @rate
attributes :id, :location_id, :value

次に @locations rabl ビューで:

node :rate do |location|
  rate = location.rates.where(:pair => @pair).first
  partial("rates/show", :object => rate)
end
于 2012-09-05T18:00:22.027 に答える
2

あなたのコード: location.rates.where(:pair => @pair).firstRate オブジェクト全体を返します。特定のフィールド (例: create_at、updated_at などを除くすべて) が必要な場合は、次の 2 つのオプションがあります。

node() でハッシュを手動で記述します。

node (:rate) do |location|  
   loc = location.rates.where(:pair => @pair).first
   { :pair => loc.pair, :value => loc.value, etc... }
end

または、これを行うことができます:

node (:rate) do |location|  
   location.rates.where(:pair => @pair).select('pair, value, etc...').first
end

...そして補足として、ビューにロジック (rates.where) を配置することはベスト プラクティスではありません。Rateモデルを使用して、コントローラがビューに対してそれを実行できるかどうかを確認してください。

于 2012-09-05T18:01:32.123 に答える