Rails 3 ответить на вопрос JSON - PullRequest
2 голосов
/ 11 мая 2011

Возникли проблемы с генерацией JSON. Я пытаюсь сделать один активный результат записи в JSON, как это:

@data = User.find(1)
respond_with(@data, :include => :status)

Результат json:

{
  -user: {
    address: null
    email: "test@email.com"
    first_name: "Test"
    last_name: "Man"
    status_id: 1
    username: "testguy"
    status: { }
  }
}

Так в чем проблема? Проблема в том, что статус: include =>: кажется не переносить отношения. В моей модели пользователя у меня есть принадлежат: статус. Как мне заставить это работать на одном наборе результатов?

Когда я делаю это:

@data = User.where("id = 1")
respond_with(@data, :include => :status)

Отношение показывает, что в наборе результатов json все отлично. Но это в массиве объектов, которые я не хочу.

Есть идеи?

Ответы [ 5 ]

7 голосов
/ 20 января 2012

Я предполагаю, что status , который вы хотите включить, не является ни одним из кодов состояния http (200, 201 и т. Д.), Ни объектом, связанным каким-либо образом с объектом User, и является вашей собственной переменной. .

Используя Rails 3.0.10 и Ruby 1.9.2, вы можете найти одно из этих двух подходящих для вас решений. Вместо respond_with используйте render следующим образом.

Раствор 1

render :json => {:data => @data, :status => "whatever"}

Результат json:

{
  data:
  {
    user:
    {
      address: null
      email: "test@email.com"
      first_name: "Test"
      last_name: "Man"
      status_id: 1
      username: "testguy"
    }
  }
  status: "whatever"
}

Решение 2

render :json => {:user => {:address => @data.address, :email => @data.email, ..., :status => "whatever"}}

Результат json:

{
  user:
  {
    address: null
    email: "test@email.com"
    ...
    status: "whatever"
  }
}

Надеюсь, это то, что вы искали.

4 голосов
/ 22 июня 2011

Звучит так, как будто вы испытываете те же страдания, которые я испытал при использовании сериализации встроенных рельсов.В итоге я использовал шаблоны RABL, которые сделали мою жизнь намного проще.Если вам нужно руководство по быстрому началу работы с RABL, я составлю его:

http://blog.dcxn.com/2011/06/22/rails-json-templates-through-rabl/

3 голосов
/ 25 июля 2013

where возвращает массив, поэтому ваши результаты имеют смысл. Вам потребуется where().first, или, поскольку это просто поиск по идентификатору, просто используйте find.

Это было давно, но все же, это самый краткий ответ:

@data = User.find(1)
respond_with(@data, :include => :status)
1 голос
/ 13 сентября 2011

Как указал nixterrimus, RABL - это действительно путь.Это просто, чисто и элегантно.Я относительно новичок в rails и не использовал эти методы (to_json и т. Д.), Но, проведя некоторое исследование и фактически используя RABL, я не могу не задаться вопросом, почему это не встроенная функция Rails.

1 голос
/ 11 мая 2011

Возможно, вы уже решили это, приятель, но если вы все еще сталкиваетесь с пробами, вы можете сделать это так, если хотите?

@data = User.find(1, :include => :status)

respond_to do |format|
  format.json do
    render @data.to_json(:include => :status)
  end
end

Если это не сработает, возможно, что-то не так с вашими ассоциациями. В API есть действительно хороший раздел «Стремительная загрузка ассоциаций»:

http://apidock.com/rails/ActiveRecord/Associations/ClassMethods

...