Неправильные рельсы JSON и jQuery - PullRequest
2 голосов
/ 26 марта 2011

Я хочу вернуть некоторые данные для запроса json в рельсах, и мне было интересно, если возвращаемые данные искажены.Вот сокращенный пример:

[{"company":{"name":"A"}},{"company":{"name":"B"}}]

Я всегда думал, что при возврате json он должен описывать корневой элемент и множественное число, поэтому он должен возвращать что-то более похожее на:

{"companies":[{"name":"A"},{"name":"B"}]}

Вотвопросы - есть ли способ заставить мой JSON выйти в этом формате?Это даже правильный формат или каждый узел компании должен быть также помечен?Нужно ли создавать пользовательский вид, чтобы получить мои результаты?Каков наилучший способ заставить jQuery зацикливать данные в текущем формате?Прямо сейчас я использую:

format.json  { render :json => @companies.to_json() }

Для отображения результатов.

Заранее благодарен за любую помощь / совет.

Ответы [ 2 ]

4 голосов
/ 26 марта 2011

Возможно, вы ищете что-то вроде спецификации JSend . Я сам придумал это прежде, чем понял, что это было сделано раньше, потому что я нашел чрезвычайно полезным иметь стандартный контейнер ответов для служб JSON.

Вот как бы я переписал ответ вашего сервера:

format.json do
  render :json => {
    :status => 'success',
    :data => {
      :companies => @companies
    }
  }
end

В некоторых случаях вам необходимо изменить атрибуты, которые генерируются при преобразовании в JSON. В этих случаях я просто использую map:

format.json do
  render :json => {
    :status => 'success',
    :data => {
      :companies => @companies.map do |company|
        hash = company.attributes
        hash['address'] = company.address
        hash.delete('secret')
        hash
      end
    }
  }
end

Немного более многословно, чем to_json, но он более гибок и так же хорошо работает в промежуточном программном обеспечении Rack.

1 голос
/ 26 марта 2011

Оба действительны в формате JSON. Однако я бы с вами согласился, что второе предпочтительнее. Это менее избыточно, так как первый имеет ненужный объектный слой и повторяет ключ компании. Но более тонким преимуществом является то, что второе защищает вас от JSON-взлома , что возможно только тогда, когда корневая структура представляет собой массив.

Для первого цикла используйте, например,

$.getJSON(url, functon(resp)
{
  for(var i = 0; i < resp.length; i++)
  {
     var company = resp[i].company;
     var name = company.name;
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...