在我的控制器中我有:
def search
@kategoris = Kampagner.where("titel like ?", "%#{params[:q]}%")
@kate = []
@kategoris.each do |kat|
h = {}
kat.attributes.each{|k,v| h[k] = v.respond_to?(:force_encoding) ? v.dup.force_encoding("UTF-8") : v }
@kate << h
end
respond_to do |format|
format.html
format.json { render :json => @kate }
end
end
但问题只是模型的所有属性都在JSON数据中。我只是JSON数据中的属性ID和标题。我该如何选择?
答案 0 :(得分:2)
我会这样做:
@kategoris.each do |kat|
@kate << kat.sanitized_whitelist
end
模特:
WHITE_LIST_ATTRS = [:id, :title]
def whitelist
WHITE_LIST_ATTRS.each_with_object({}) {|attr, hash| hash[attr] = send(attr) }
end
或考虑一些专用方法:
def sanitized_whitelist
WHITE_LIST_ATTRS.each_with_object({}) {|attr,hash| hash[attr] = send(attr).respond_to?(:force_encoding) ? send(attr).dup.force_encoding("UTF-8") : send(attr) }
end
答案 1 :(得分:2)
我不清楚你为什么要使用force_encoding。但你可以简单地打电话:
format.json { render :json => @kategoris }
Rails会在场景后面调用方法as_json。然后在Kampagner类中,您可以自定义as_json类来控制将记录导出到JSON时将显示的内容:
class Kampagner
def as_json(options={})
super(options.merge({ :only => [:id, :title]})
end
end
查看更多:http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html