【问题标题】:RABL - attributes within child nodeRABL - 子节点内的属性
【发布时间】:2012-09-05 17:14:53
【问题描述】:

如果我在 RABL 中使用 node() 方法创建一个子节点,如何控制呈现的属性?

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

我尝试使用部分和“扩展”方法,但它完全搞砸了。另外,我尝试向块中添加属性,但没有成功(输出与属性中指定的一样,但没有显示每个属性的值)。

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby json rabl


    【解决方案1】:

    您的代码: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 模型对视图执行此操作。

    【讨论】:

    • 谢谢...我最终选择了“手动”解决方案。在视图中执行此逻辑的原因是我必须遍历每个 Location 对象并查找速率,然后将两者都输出。我试图考虑在控制器中执行此操作,但它似乎太复杂了(我想这将涉及创建一些新对象来保存每个位置和相应的费率)..所以我决定为了简单起见在视图中执行此操作跨度>
    【解决方案2】:

    您将无法在节点块中使用attributes,因为其中的“self”仍然是根对象或集合,因此在您的情况下为@locations。另见RABL wiki: Tips and tricks (When to use Child and Node)

    在节点块中,您可以通过仅列出您感兴趣的属性来简单地创建自定义响应:

    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
    

    【讨论】:

    • 真的吗?同样的方法对我有用。您遇到了什么错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多