我有一个Place
模型和一个PlacesController
。目前,控制器使用某些对象响应JSON。我想为响应的对象添加更多字段。例如,我想添加方法Place.tags
查询的每个地方的标签。
我正在考虑两个解决方案:将对象列表转换为哈希列表并添加我想要的属性,或者在模型中添加新列,将其填充到控制器中迭代对象列表。我不确定是否有更好的方法来做到这一点。
答案 0 :(得分:4)
我假设:
class Place < ActiveRecord:Base
has_many :tags
如果是这样,您是否只是尝试将相关标签添加到地方对象的json?如果是这样,你可以使用(其中'place'是Place对象):
place.to_json(:include=>:tags)
答案 1 :(得分:1)
您也可以使用模板生成JSON。它将使您可以控制JSON中显示的内容,并且比通过to_json或render渲染要快得多:json。
查看我关于在这里呈现JSON的最快方式的问题:What is the fastest way to render json in rails。
我发现RABL(https://github.com/nesquena/rabl)快速且易于设置。
对于您的示例,在RABL中,您可以执行以下操作:
class PlacesController < ApplicationController
def show
@place = Place.find(params[:id])
end
end
在视图中:
object @place => :place
attributes :id, :name
children :tags => :tags do
attributes :id, :name
end
答案 2 :(得分:0)
在这种情况下,我可能会使用演示者模式。看看这里:http://blog.jayfields.com/2007/03/rails-presenter-pattern.html
如果您拥有专业版帐户,还可以使用railscast:http://railscasts.com/episodes/287-presenters-from-scratch
答案 3 :(得分:-1)
我不确定我的解决方案是更好的方法
# in controller
@place = Place.first
@place[:place_tags] = @place.tags.map(&:attributes)
render :json => @place