使用' as_json'的问题在我的模型和'渲染:json' =>在我的控制器(轨道)

时间:2011-03-20 01:06:32

标签: ruby-on-rails ruby json

我正在尝试创建一个独特的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'以实际显示在那里.......

我希望有人在这里帮助......谢谢!

2 个答案:

答案 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