В Rails, как вы обрабатываете JSON с помощью представления? - программирование

В Rails, как вы обрабатываете JSON с помощью представления?

Предположим, что вы находитесь в своем пользовательском контроллере, и вы хотите получить ответ json для запроса на показ, было бы неплохо, если бы вы могли создать файл в своих представлениях /users/dir с именем show.json и после вашего пользователи # show action завершены, он отображает файл.

В настоящее время вам нужно сделать что-то по строкам:

def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json{
      render :json => @user.to_json
    }
  end
end

Но было бы неплохо, если бы вы могли просто создать файл show.json, который автоматически будет выглядеть так:

def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json
  end
end

Это спасло бы меня от печали и смыло бы это ужасно грязное чувство, которое я получаю, когда я делаю свой json в контроллере

4b9b3361

Ответ 1

В блоке respond_to вы должны сделать что-то вроде этого:

format.json render :partial => "users/show.json"

который отобразит шаблон в app/views/users/_show.json.erb.

Ответ 2

Попробуйте добавить представление users/show.json.erb Это должно отображаться, когда вы делаете запрос для формата JSON, и получаете дополнительное преимущество от его рендеринга с помощью erb, поэтому ваш файл может выглядеть примерно так:

{
    "first_name": "<%= @user.first_name.to_json %>",
    "last_name": "<%= @user.last_name.to_json %>"
}

Ответ 3

Как уже упоминалось, вам нужен просмотр users/show.json, но есть варианты, которые следует учитывать для языка шаблонов...

ERB

Работает из коробки. Отлично подходит для HTML, но вы быстро найдете его ужасным для JSON.

RABL

Хорошее решение. Необходимо добавить зависимость и узнать ее DSL.

JSON Builder

То же самое дело, что и RABL: Хорошее решение. Необходимо добавить зависимость и узнать ее DSL.

Обычный рубин

Ruby является потрясающим при создании JSON, и нет ничего нового, чтобы узнать, как вы можете называть to_json на Hash или AR-объекте. Просто зарегистрируйте расширение .rb для шаблонов (в инициализаторе):

ActionView::Template.register_template_handler(:rb, :source.to_proc)

Затем создайте просмотр users/show.json.rb:

@user.to_json

Для получения дополнительной информации об этом подходе см. http://railscasts.com/episodes/379-template-handlers

Ответ 4

RABL, вероятно, является лучшим решением для этого, что я видел, если вы ищете более чистую альтернативу синтаксису ERb. json_builder и аргонавт, которые являются другими решениями, кажутся несколько устаревшими и не будут работать с Rails 3.1 без каких-либо исправлений.

RABL можно получить через жемчужину или проверить репозиторий GitHub; хорошие примеры тоже

https://github.com/nesquena/rabl

Ответ 5

Просто чтобы обновить этот ответ ради других, которые оказались на этой странице.

В Rails 3 вам просто нужно создать файл в views/users/show.json.erb. Объект @user будет доступен для представления (как и для html). Вам больше не понадобится to_json.

Подводя итог, просто

# users contoller
def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json
  end
end

и

/* views/users/show.json.erb */
{
    "name" : "<%= @user.name %>"
}

Ответ 6

Просто добавьте show.json.erb файл с содержимым

<%= @user.to_json %>

Иногда это полезно, когда вам нужны дополнительные вспомогательные методы, недоступные в контроллере, т.е. image_path(@user.avatar) или что-то для создания дополнительных свойств в JSON:

<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %>