在Rails中生成自定义JSON响应的困惑

时间:2011-09-27 21:05:24

标签: ruby-on-rails json

型号说明:

用户,小工具,购买

User
has_many :purchases
has_many :widgets, :through => :purchases

Widget
has_many :purchases
has_many :users, :through => :purchases

Purchase
belongs_to :user
belongs_to :widget

希望这对下面的内容有意义并且是正确的。

是的,在我的控制器中,我有current_user。

我希望最终使用jquery模板呈现嵌套的JSON响应。

像这样理想:

{
    "purchases": [
        {
            "quantity": 200,
            "price": "1.0",
            "widget": {
                "name": "Fantastic Widget",
                "size": "Large"
            }
        },
        {
            "quantity": 300,
            "price": "3.0",
            "widget": {
                "name": "Awesome Widget",
                "size": "Medium"
            }
        }
    ]
}

此:

render :json => current_user.to_json(:include => [:purchases, :widgets])

将呈现一些current_user详细信息(不是真正相关),然后在同一级别上购买和小部件。

这有效(输出一些当前用户的详细信息,但这不是我目前的主要抱怨):

render :json =>  current_user.to_json({:include => :purchases })

但显然只输出购买数据。即使在查看此示例之后,我也无法获得嵌套的包含工作(它应该工作吗?):

konata.to_json(:include => { :posts => {
                                     :include => { :comments => {
                                                   :only => :body } },
                                     :only => :title } })

来自here和此existing stackoverflow question

所以我让自己完全糊涂了。帮助赞赏。

2 个答案:

答案 0 :(得分:2)

我会考虑在模型中使用as_json方法来获得所需的输出。将以下内容添加到模型中可以使您朝着正确的方向前进。

#users model
def as_json(options={})
   {:purchases => self.purchases}
end

#purchases model
def as_json(options={})
   {:quantity: self.quantity,
   :price: self.price,
   :widget: self.widget}
end

#widgets model
def as_json(options={})
   {:name:self.name,
   :size: self.size}
end

添加完这些后,您只需在用户实例上使用to_json即可正确输出。

答案 1 :(得分:2)

RABL可让您制作类似于HTML ERB视图的JSON视图。

此博文“If you’re using to_json, you’re doing it wrong”解释了使用to_json的一些背景和缺点。