Rails — возвращает все значения для вложенных атрибутов, а не только «указатель».

Итак, последние пару часов я бился головой о стену, пытаясь получить это. Кроме того, я изменю название вопроса, когда узнаю название вещи ниже.

Первый вопрос, как это называется? #<Comment:0x007fda3aaeb7c8> который возвращается из базы данных.

Во-вторых, я пытаюсь вернуть (рендерить json) комментарий, содержащий дочерние комментарии.

Что-то вроде этого:

[
  {
   id: 1,
   title:'title',
   body:'body'
  },
  {
   "#< Comment:0x007fda3b3517f0>": {},
   "#< Comment:0x007fda3b3517f0>": {},
  }
]

Как вернуть значения этих комментариев? Когда я помещаю их в консоль, она показывает их атрибуты и значения, например:

puts comments[0][1]

{#<Comment id: 17, body: "Another Reply Test", created_at: "2016-08-20 04:05:16", updated_at: "2016-08-20 04:05:16", parent_id: 13, user_id: 54>=>{}, #<Comment id: 18, body: "Another Reply Test", created_at: "2016-08-20 04:05:16", updated_at: "2016-08-20 04:05:16", parent_id: 13, user_id: 54>=>{}}

но если я попытаюсь изменить их вообще - например, to_a или to_json - он просто взорвется (из-за отсутствия лучшего термина) вот так:

puts comments[0][1].to_a
#<Comment:0x007fda3b1911b8>
{}
#<Comment:0x007fda3b190fd8>
{}

Я использую Postgres, и я использую hash_tree closure_tree для сортировки комментариев.

Любые советы будут очень признательны, особенно с первым вопросом.

РЕДАКТИРОВАТЬ: индекс определения, который возвращает комментарии:

def index
        if request.headers["type"] == 'music'
            comments = Comment.where("song_id = ?", request.headers["id"]).hash_tree.to_a
            comments.each do |comment|
                puts comment[1] #shows all attributes and values
                puts comment[1].to_a #blows up
                puts comment[1].to_s #works
            end
        end
        if comments
            render json: {status:200, success:true, comments:comments}
        else
            render json: {status:404, success:false}
        end
end

person Jack Rothrock    schedule 20.08.2016    source источник


Ответы (2)


Этот вывод является строковым представлением вывода по умолчанию — имя класса плюс необработанное значение указателя базового объекта. Некоторые из вещей, которые вы пытаетесь сделать (например, конвертировать в json), пытаются преобразовать их ввод в строку (с помощью метода to_s)

Похоже, что у вас есть комментарии в качестве ключа в хеше, что не имеет смысла, если вывод должен быть в формате json — ключи в JSON должны быть строками.

person Frederick Cheung    schedule 20.08.2016
comment
Аааа, ладно, о поиске в Google моего выхода, наверное, не может быть и речи. Это просто результат, который я получаю в Postman, я не верю, что это настоящие строки, поскольку путы работают. Кроме того, to_s работает, знаете ли вы, почему они не полностью рендерятся, а показывают только свой указатель? Я обновляю вопрос, чтобы показать, как он отображается. - person Jack Rothrock; 20.08.2016

Ответ на мою борьбу состоял в том, чтобы использовать .as_json.merge!(children=>[]), затем вставить все основные комментарии в приведенное выше, а затем вставить вышеуказанное в комментарий.

Вот репозиторий для всех, кому интересно: https://github.com/jrothrock/comments/

person Jack Rothrock    schedule 30.08.2016