Включение атрибута «тип» в json response_with Rails 3.1 - PullRequest
11 голосов
/ 20 января 2012

Кажется, что при возврате объекта, содержащего атрибут «тип» в виде JSON из приложения Rails 3.1, атрибут «тип» не включается. Предположим, у меня есть следующее:

Модель с соответствующей таблицей STI Animal. Модели кошек, собак и рыб, которые наследуют животных.

При возврате Animal через JSON я хочу включить столбец "type", но этого не происходит:

jQuery.ajax("http://localhost:3001/animals/1", {dataType: "json"});

выходы:

responseText: "{"can_swim":false,"created_at":"2012-01-20T17:55:16Z","id":1,"name":"Fluffy","updated_at":"2012-01-20T17:55:16Z","weight":9.0}"

Кажется, это проблема с to_json:

bash-3.2$ rails runner 'p Animal.first.to_yaml'
"--- !ruby/object:Cat\nattributes:\n  id: 1\n  type: Cat\n  weight: 9.0\n  name: Fluffy\n  can_swim: false\n  created_at: 2012-01-20 17:55:16.090646000 Z\n  updated_at: 2012-01-20 17:55:16.090646000 Z\n"

bash-3.2$ rails runner 'p Animal.first.to_json'
"{\"can_swim\":false,\"created_at\":\"2012-01-20T17:55:16Z\",\"id\":1,\"name\":\"Fluffy\",\"updated_at\":\"2012-01-20T17:55:16Z\",\"weight\":9.0}"

Кто-нибудь знает причину этого поведения и как его переопределить?

Ответы [ 4 ]

17 голосов
/ 26 сентября 2013

Это то, что я сделал. Он просто добавляет отсутствующий type в набор результатов

  def as_json(options={})
    super(options.merge({:methods => :type}))
  end
6 голосов
/ 20 января 2012

Переопределить метод as_json . Используется to_json для получения результата. Вы можете сделать что-то вроде:

def as_json options={}
 {
   id: id,
   can_swim: can_swim,
   type: type
 }
end
0 голосов
/ 08 июля 2013

Вот мое решение, которое может сохранить оригинальную функцию as_json.

def as_json(options={})
  options = options.try(:clone) || {}
  options[:methods] = Array(options[:methods]).map { |n| n.to_sym }
  options[:methods] |= [:type]

  super(options)
end
0 голосов
/ 08 марта 2013

Для меня в Rails 2.3.12 вышеупомянутое не работает.

Я могу (в моей модели, конечно) сделать что-то вроде этого:

class Registration < ActiveRecord::Base

  def as_json(options={})
    super(options.merge(:include => [:type]))
  end

end

Но это вызываетto_json, чтобы выдать ошибку вроде этого:

NoMethodError: undefined method `serializable_hash' for "Registration":String

Я работал с этим с этим, который перфорирует этот метод на объект, который я хочу экспортировать

class Registration < ActiveRecord::Base

  def as_json(options={})
    super(options.merge(:include => [:type]))
  end

  def type
    r  = self.attributes["type"]
    def r.serializable_hash(arg)
      self
    end
    r
  end
end

Итакприложение, я поместил это в миксин:

module RailsStiModel
  # The following two methods add the "type" parameter to the to_json output.
  # see also:
  # /6076294/vklychenie-atributa-tip-v-json-responsewith-rails-3-1
  def as_json(options={})
    super(options.merge(:include => [:type]))
  end

  def type
    r  = self.attributes["type"]
    def r.serializable_hash(arg)
      self
    end
    r
  end
end

А теперь в моей модели класса, я добавляю:

include RailsStiModel
...