Rails рендеринг данных JSON с помощью Model Root - PullRequest
8 голосов
/ 26 августа 2010

У меня есть некоторые данные в Rails, которые я хочу визуализировать как данные JSON.Сейчас я просто нахожу все экземпляры модели и вызываю render: json => data.

data = Data.find(:all)
render :json => data

Однако Rails включает имя модели в каждый объект JSON.Таким образом, мои данные JSON в конечном итоге выглядят так:

[{modelname:{propertyName: 'value',...}},{modelname:{propertyName: 'value2',...}}]

вместо этого: [{propertyName: 'value', ...}, {propertyName: 'value2', ...}]

Название модели всегда одинаковое, и я не хочу, чтобы оно там было.

Я изменил опцию рендеринга корня в данных JSON в одном из инициализаторов Rails, но это влияет на все, что я хочу визуализировать как JSON, что я не хочу делать для этого проекта.

В этом случае я хочу иметь возможность делать это в каждом конкретном случае.

Как я могу это сделать?Заранее спасибо.

Ответы [ 3 ]

13 голосов
/ 13 июня 2013

В Rails 3 вы можете использовать активную_модель_сериализаторов gem 1

, которая позволяет вам определять рендеринг объекта без корня, например:

render :json => data, :root => false
2 голосов
/ 26 августа 2010

Я не нашел способа сделать это путем передачи параметров в метод to_json (и я не верю, что такой вариант есть).У вас есть больше альтернатив для этого, любой класс, унаследованный от ActiveRecord :: Base, будет иметь include_root_in_json.

Сделайте что-то подобное.

Data.include_root_in_json = false
data = Data.find(:all)
render :json => data

Надеюсь, это поможет вам.

Хорошо, давайте попробуем это тогда.

DataController < ApplicationControlle

  private

  def custom_json(data)
    Data.include_root_in_json = false
    data.to_json
    Data.include_root_in_json = true
    data
  end
end

Тогда ваш редирект будет выглядеть следующим образом

data = Data.find(:all)
render :json => custom_json(data)

Это довольно глупый код, я бы хотел думать о чем-то другом полностью.Позвольте мне спросить вас: что означает включение названия модели в данные json?

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

С Rails 3 я нашел этот способ лучше.Переопределите as_json в вашей модели и сделайте следующее:

def as_json(options = {})
    super(options.merge :methods => [:some_method_that_you_want_to_include_result], :include => {:child_relation => {:include => :grand_child_relation } })
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...