Массив Ruby в JSON и рендеринг JSON в Rails - PullRequest
5 голосов
/ 23 ноября 2010

У меня есть массив Ruby, как я могу отобразить это как представление JSON в Rails 3.0?

Мой метод контроллера -

def autocomplete
     @question = Question.all
end

Ответы [ 2 ]

18 голосов
/ 26 сентября 2011

Если действие автозаполнения только рендерит JSON, вы можете упростить решение re5et до:

def autocomplete
  questions = Question.all
  render :json => questions
end

(обратите внимание, что я расшифровал 'вопрос', чтобы отразить, что это массив, и удалил символ @ - достаточно локальной переменной, поскольку вы, вероятно, используете ее только для рендеринга встроенного JSON)

Как своего рода дополнение, потому что я подозреваю, что люди могут попасть на эту страницу в поисках решения для плагина jquery ui autocomplete, рендеринг массива question для JSON не будет работать. Плагин требует определенного формата, как описано здесь :

Локальные данные могут быть простым массивом строк или содержать объекты для каждого элемента в массиве со свойством метки или значения или обоими. Свойство метки отображается в меню предложений. Значение будет вставлено в элемент ввода после того, как пользователь выберет что-то из меню. Если указано только одно свойство, оно будет использоваться для обоих, например. если вы укажете только значение-свойства, значение также будет использоваться в качестве метки.

Когда используется строка, плагин автозаполнения ожидает, что эта строка будет указывать на ресурс URL, который будет возвращать данные JSON. Это может быть на том же хосте или на другом (должен предоставить JSONP). Параметр запроса "term" добавляется к этому URL. Сами данные могут быть в том же формате, что и локальные данные, описанные выше.

Другими словами, ваш json должен выглядеть примерно так (в простейшем виде):

[{'value': "Option1"},{'value': "Option2"},{'value': "etc"}]

Вы можете сделать это в ruby ​​следующим образом:

def autocomplete
  questions = Question.all # <- not too useful
  questions.map! {|question| {:value => question.content}}
  render :json => questions
end

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

UPDATE: да, это работает!

ОБНОВЛЕНИЕ 2:

Новый способ рельсов сделать это (добавлен в рельсы 3.1) будет:

class MyController < ApplicationController
  respond_to :json
  # ...
  def autocomplete
    questions = Question.all # <- not too useful
    questions.map! {|question| {value: question.content}}
    respond_with(questions)
  end
end
9 голосов
/ 23 ноября 2010
def autocomplete
     @question = Question.all
     respond_to do |format|
       format.json { render :json => @question }
     end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...