Пользовательский метод to_json не вызывается в приложении Rails - PullRequest
1 голос
/ 08 июля 2010

У меня есть приложение Ruby on Rails, над которым я работаю над API для связанного приложения iPhone.

Я переписал метод to_json моей модели Item, чтобы получить некоторую пользовательскую информацию из запроса API, которая понадобится мне в приложении iPhone.

Однако, когда я использую встроенный метод rails to_json и включаю свою модель Item в качестве связанного параметра, мой метод Item#to_json не вызывается, а вызывается просто to_json по умолчанию для объекта AR.

См. Следующий код (@api_user is a User model object)

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

Я включаю ассоциацию friends, которая в свою очередь включает ассоциацию items, но вызывается элемент по умолчанию to_json для Item, а не мой пользовательский 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 ]

1 голос
/ 08 июля 2011

Вы используете Devise? Если это так, они перезаписывают методы to_json и to_xml (спасибо, ребята).

Из источника разработки:

  %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
0 голосов
/ 28 ноября 2011

Нет ли более простого метода для переопределения метода to_json? Использование Devise не решает общую проблему. Есть много причин, по которым я мог бы захотеть НЕ выполнять маршалинг некоторых атрибутов конкретного объекта, поэтому требуется специальный метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...