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”仍然是根对象或集合,因此在您的情况下是@locations. 另请参阅RABL 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).first返回整个 Rate 对象。如果您想要特定字段(例如:所有,除了 create_at、updated_at 等),那么您有两个选择:

在 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 回答