在Rails应用程序中没有调用自定义to_json方法

时间:2010-07-08 16:38:21

标签: ruby-on-rails ruby json api

我有一个Ruby on Rails应用程序,我正在为相关的iPhone应用程序开发API。

我已经覆盖了我的Item模型的to_json方法,以便从我在iPhone应用程序中需要的API请求中返回一些自定义信息。

但是,当我使用内置rails to_json方法并将我的Item模型作为关联参数包含时,我的Item#to_json方法不会被调用,只会调用AR对象的默认to_json。

请参阅以下代码(@api_user is a User model object

    render :json => @api_user.to_json( :include => { :friends => { :include => :items, :except => :api_token } } )

我包含的friends关联又包含了items关联,但是调用了Item上的默认to_json,而不是我的自定义to_json。

我错过了什么?

这是我的Item#to_json方法

  def to_json(options={})
{
  :id => self.id,
  :name => name,
  :description => description,
  :url => url,
  :quantity => quantity,
  :price_range_raw => price_range,
  :price_range => human_readable_price_range( price_range ),
  :can_be_purchased => can_be_purchased?,
  :completely_purchased => completely_purchased?,
  :remaining_qty => remaining_quantity,
  :thumb_photo_url => photo.url(:thumb),
  :small_photo_url => photo.url(:small),
  :large_photo_url => photo.url(:large),
  :priority_raw => priority,
  :priority => human_readable_priority( priority )
}.to_json

没有其他模型覆盖#to_json方法

2 个答案:

答案 0 :(得分:1)

你在使用Devise吗?如果是这样,他们会覆盖to_json和to_xml方法(谢谢,伙计们)。

来自Devise来源:

  %w(to_xml to_json).each do |method|
    class_eval <<-RUBY, __FILE__, __LINE__
      def #{method}(options={})
        if self.class.respond_to?(:accessible_attributes)
          options = { :only => self.class.accessible_attributes.to_a }.merge(options || {})
          super(options)
        else
          super
        end
      end
    RUBY
  end

答案 1 :(得分:0)

是否有更简单的方法来覆盖to_json方法?使用Devise并不能解决一般问题。我有很多理由可以选择不编组特定对象的某些属性,因此需要自定义方法。