我正在尝试创建一个独特的json数据结构,我遇到了一个我似乎无法弄清楚的问题。
在我的控制器中,我正在做:
favorite_ids = Favorites.all.map(&:photo_id)
data = { :albums => PhotoAlbum.all.to_json,
:photos => Photo.all.to_json(:favorite => lambda {|photo| favorite_ids.include?(photo.id)}) }
render :json => data
在我的模特中:
def as_json(options = {})
{ :name => self.name,
:favorite => options[:favorite].is_a?(Proc) ? options[:favorite].call(self) : options[:favorite] }
end
问题是,rails编码了“照片”和“照片”的值。 '专辑'(在我的数据哈希中)作为JSON两次,这打破了一切...我能让这个工作的唯一方法就是我叫'as_json'而不是'to_json':
data = { :albums => PhotoAlbum.all.as_json,
:photos => Photo.all.as_json(:favorite => lambda {|photo| favorite_ids.include?(photo.id)}) }
然而,当我这样做时,我的:最爱=> lambda选项不再使它成为模型的as_json方法..........所以,我要么告诉'render:json'不要对hash的值进行编码,所以我可以使用'to_json'在我自己的价值观上,或者我需要一种方法来将参数传递给'as_json'以实际显示在那里.......
我希望有人在这里帮助......谢谢!
答案 0 :(得分:0)
我认为运行这行代码
render :json => {:key => "value"}
等于
render :text => {:key => "value"}.to_json
换句话说,请勿同时使用to_json
和:json
。
答案 1 :(得分:0)
好的,我放弃了...我通过添加自己的数组方法来解决这个问题,以处理对集合的操作。
class Array
def to_json_objects(*args)
self.map do |item|
item.respond_to?(:to_json_object) ? item.to_json_object(*args) : item
end
end
end
class Asset < ActiveRecord::Base
def to_json_object(options = {})
{:id => self.id,
:name => self.name,
:is_favorite => options[:favorite].is_a?(Proc) ? options[:favorite].call(self) : !!options[:favorite] }
end
end
class AssetsController < ApplicationController
def index
@favorite_ids = current_user.favorites.map(&:asset_id)
render :json => {:videos => Videos.all.to_json_objects(:favorite => lambda {|v| @favorite_ids.include?(v.id)}),
:photos => Photo.all.to_json_objects(:favorite => lambda {|p| @favorite_ids.include?(p.id)}) }
end
end