Rails3: взять под контроль сгенерированный JSON (to_json с помощью ORM) - PullRequest
3 голосов
/ 18 сентября 2010

Из моего приложения на Rails 3 я хочу JSON, например: {Количество: 10, фотографий:[ {ID: 1}, ...]} Я пытался

render( :json => { :count => 10, :pictures => @pictures.to_json(:only=>:id) } )

но в этом случае мои картинки экранируются

..."pictures":"[{\"id\":2653299}, ....

В моем старом приложении merb в контроллере была следующая строка:

    display( { :count=>@count, :pictures => @pictures } ) 

Поскольку я использую datamapper в качестве ORM и dm-serializer, я не уверен, где можно повлиять на сгенерированный JSON.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2010

Ваш код должен быть:

render( :json => {:count => 10, :pictures => @pictures })

без вызова: to_json явно в @pictures (так же, как это было в вашем приложении Merb).

Однако, это будет бомбить в дм-1.0 без этого коммита: http://github.com/datamapper/dm-serializer/commit/64464a03b6d8485fbced0a5d7150be90b6dcaf2a

Полагаю, он скоро выйдет, но в то же время его легко исправить.

1012 * редактировать *

Я упустил из виду тот факт, что вы хотите использовать: only => [: id] в вашей коллекции. Похоже: as_json не был реализован в коллекциях по какой-либо причине. Вы можете обойти это несколькими способами. Ваш пример может выглядеть так:

render( :json => {:count => 10, :pictures => @pictures.map {|p| p.as_json(:only => [:id])}} )

Это превратит вашу коллекцию картинок в хэш идентификаторов. рендер будет делать все правильно, и вы должны получить желаемые результаты. (Надеюсь)

0 голосов
/ 20 сентября 2010

Попробуйте использовать функцию «raw».Rails 3 по умолчанию экранирует вывод в представлении.Попробуйте что-то вроде этого:

raw render( :json => { :count => 10, :pictures => @pictures.to_json(:only=>:id) } )

или, возможно, можно избежать его внутри функции рендеринга (хотя я никогда не пробовал этого):

render( :json => { :count => 10, :pictures => raw(@pictures.to_json(:only=>:id)) } )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...