我有一个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
方法
答案 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并不能解决一般问题。我有很多理由可以选择不编组特定对象的某些属性,因此需要自定义方法。