Как настроить метод to_json в rails3? - PullRequest
5 голосов
/ 16 января 2011

Я хочу преобразовать массив объектов Place в json, я делаю это так:

var places = <%= @places.to_json.html_safe %>;

Единственная проблема состоит в том, что каждое место в массиве @places имеет связанный список тегов, который не включается. Я использую гем act_as_taggable_on для обработки тегов, поэтому, чтобы получить список тегов для места, я должен сказать place.tag_list.

Что мне нужно сделать, чтобы добавить tag_list для каждого места в массиве javascript? Думаю, мне нужно написать собственный метод to_json, но я не знаю, как.

EDIT

Оказывается, это проще, чем я думал. Я был в состоянии сказать это:

var places = <%= @places.to_json(:include => :tags).html_safe %>

Единственная проблема состоит в том, что это включает в себя больше информации о каждом теге, чем мне действительно нужно. У каждого тега есть идентификатор и имя, что мне действительно нужно, так это список с именами тегов.

Ответы [ 4 ]

5 голосов
/ 16 января 2011

Метод to_json также принимает аргумент с именем methods. Этот аргумент позволяет указать методы, которые должны вызываться и включаться в представление объекта в формате json. Поскольку вы упомянули, что у вас есть метод с именем tag_list, вы можете сделать это:

var places = <%= @places.to_json(:methods => :tag_list).html_safe %>

Если по какой-то причине у вас нет метода для создания имен тегов, но у каждого тега есть метод, чтобы дать вам свое имя, вы можете добавить метод внутри вашей модели Place для создания списка тегов имена вроде так:

def tag_names
    tags.collect do |tag|
        tag.name
    end
end

Тогда вы могли бы получить свои места JSON с tag_names, как это:

place_json = @places.to_json(:methods => :tag_names)

Этот метод будет работать для любых вычисляемых атрибутов, которые вы хотели бы добавить в представление json модели.

2 голосов
/ 16 января 2011

В вашем классе Place вы можете переопределить to_json.В Rails 3 вы должны переопределить as_json вместо:

def as_json (options={})
  # add whatever fields you need here
end

Затем измените свой код на:

var places = <%= @places.as_json.html_safe %>;
1 голос
/ 26 февраля 2011

Ответ Бенсона не будет работать, если вы звоните

render :json => @places

в PlacesController.Вам нужно будет добавить следующий код в модель Place.

# this method is called on a single instance
def to_json(options={})
  options[:methods] ||= []
  options[:methods] << :tag_names
  super(options)
end

# this method is called for each instance in an Array to avoid circular references.
def as_json(options={})
  options[:methods] ||= []
  options[:methods] << :tag_names
  super(options)
end

Надеюсь, что это поможет кому-то еще.Мне пришлось просмотреть исходный код, чтобы понять, почему Array.to_json не совпадает с Array.each { |a| a.to_json }

0 голосов
/ 13 июня 2011

Я бы порекомендовал проверить этот пост, если вы делаете более сложный JSON.

Как переопределить to_json в Rails?

Смотрите также эти два сообщения:

http://www.tonyamoyal.com/2011/03/25/recursive-custom-to_json-in-ruby-for-arrays-of-objects-or-nested-objects/

http://jonathanjulian.com/2010/04/rails-to_json-or-as_json/

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