Rails 3 ответ_с вопросом json

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

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

Результат json:

{
  -user: {
    address: null
    email: "[email protected]"
    first_name: "Test"
    last_name: "Man"
    status_id: 1
    username: "testguy"
    status: { }
  }
}

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

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

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

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

Любые идеи?


person Mike Jaffe    schedule 11.05.2011    source источник


Ответы (5)


Я предполагаю, что 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: "[email protected]"
      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: "[email protected]"
    ...
    status: "whatever"
  }
}

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

person mdziurla    schedule 19.01.2012

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

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

person nixterrimus    schedule 22.06.2011

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

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

@data = User.find(1)
respond_with(@data, :include => :status)
person Woahdae    schedule 25.07.2013
comment
это отлично работает для меня (а именно, указание :include в вызове respond_with), но я не могу найти никакой документации для этого, даже в responders gem README. как вы узнали, чтобы использовать эту функцию? - person Dominick; 14.05.2015

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

@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

person 2potatocakes    schedule 11.05.2011
comment
На.. пробовал. Не хорошо. Я все еще получаю пустой объект состояния в ответе json. Я знаю, что отношение работает, потому что если я запускаю @data.status в обычном представлении, я получаю объект. - person Mike Jaffe; 13.05.2011

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

person Shyam Habarakada    schedule 13.09.2011