Ruby структура данных для отображения определенного формата JSON - PullRequest
2 голосов
/ 19 апреля 2010
[
   {
      "id":"123",
      "name":"House"
   },
   {
      "id":"1456",
      "name":"Desperate Housewives"
   },
   {
      "id":"789",
      "name":"Dollhouse"
   },
   {
      "id":"10",
      "name":"Full House"
   }
]

Как я могу выполнить рендеринг для создания этого формата JSON из Ruby? У меня есть все данные из БД (@result), и я не знаю, какую структуру данных использовать в Ruby, которая будет отображаться при этом:

respond_to do |format|    
    format.json { render :json => @result}
end

Какая структура данных должна быть @result и как я могу выполнить итерацию для ее создания? Спасибо!

Ответы [ 4 ]

6 голосов
/ 19 апреля 2010

Если @result является массивом экземпляров модели ActiveRecord, то render :json => @result выдаст что-то похожее на то, что вам нужно, но будет включать все атрибуты модели (render вызывает to_json для объекта, который вы передаете если это не строка).

Чтобы включить только атрибуты id и name, вы можете использовать параметр :only, равный to_json:

respond_to do |format|    
  format.json { render :json => @result.to_json(:only => [:id, :name] }
end

Кроме того, вы можете создать массив объектов Hash, которые содержат только обязательные атрибуты:

respond_to do |format|    
  format.json { render :json => 
                  @result.collect {|o| {:id => o.id, :name => o.name} } }
end

Редактировать: См. Комментарий @ dt ниже. В модели есть атрибут с именем text, который необходимо вывести в виде имени. Это можно сделать, создав псевдоним для текста в модели:

class Model < ActiveRecord::Base
  alias_method :name, :text

и включая имя, используя :methods:

respond_to do |format|    
  format.json { render :json => @result.to_json(:only => :id, :methods => :name }
end

Кроме того, для переименования атрибута можно использовать подход с массивом хэшей:

respond_to do |format|    
  format.json { render :json => 
                  @result.collect {|o| {:id => o.id, :name => o.text} } }
end
0 голосов
/ 19 апреля 2010

Я использовал плагин jQuery (FCBKComplete), который нуждался в результатах json с конкретными именами ключей, в частности 'caption' и 'value', которых не было в массиве, который я вызывал to_json on.

Итак, я сделал это (хак, но это работает):

render :json => taggings.map { |t| {:caption => t.tag.name, :value => t.tag.name} }.to_json

Где taggings - это массив, возвращаемый функцией поиска ActiveRecord, который возвращает json следующим образом:

[{"value":"tag.a","caption":"tag.a"},{"value":"tag.b","caption":"tag.b"}]
0 голосов
/ 19 апреля 2010

Чтобы создать объект JSON этого конкретного формата, вам нужен массив ruby, содержащий хэши для его элементов.

@result = [{:id => "10", :name => "Full House"}, {:id => "789", :name => "blahblah"},...]

Rails будет правильно преобразовывать массив ruby ​​в json в вашем блоке ответа рендеринга:

respond_to do |format|    
  format.json { render :json => @result}
end
0 голосов
/ 19 апреля 2010

Попробуйте использовать json gem . Это позволит вам делать такие вещи, как

@result.to_json

чтобы преобразовать ваши структуры (скажем, Hash) в формат json. Если вы используете Ruby on Rails, эта функциональность уже должна быть вам доступна, поэтому просто создайте Hash и вызовите to_json.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...