渲染:json有额外的数据

我有一个名为Todo的模型,我渲染了这个:

format.json { render :json => @todo } 

每个Todo属于一个列表。 我想将@todo.list.completion_percentage的值添加到JSON,因为我需要这个来更新UI(AJAX请求),所以JSON看起来像这样:

 { "todo": { "created_at": "2011-02-26T19:39:43Z", "updated_at": "2011-02-26T19:53:13Z", "done": true, "text": "Apples", "id": 10, "list_id": 2, "user_id": 1, "due_date": null // BELOW THIS LINE SHOULD BE IMPLEMENTED "list": { "completion_percentage": 63 } } } 

我尝试了各种各样的东西但没有效果。 谁能帮我?

您可能希望捕获JSON数据的值,然后进行修改。

 format.json { render :json => JSON::parse(@todo.to_json).merge("list" => { "completion_percentage" => 63 }).to_json } 

要改进Brandon的答案,请尝试使用:

 render :json => @todo.attributes.merge({list: { "completion_percentage" => 63 }}) 

正如其他人所知,调用@ todo.attributes会拉动属性上的自定义方法。 例如,如果你的Todo模型中有一个方法

  def written_date self.written_date = self.written_date.utc.beginning_of_day end 

在Todo Model上有一个名为written_date的属性,只有属性会返回存储在数据库中的属性。

除了调用@todo.attributes后返回的自定义方法,你不会。