В Rails, как вы визуализируете JSON, используя представление? - PullRequest
123 голосов
/ 18 января 2010

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

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

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

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

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

Это спасет меня от горя и избавит от ужасно грязного чувства, которое возникает при рендеринге моего JSON в контроллере

Ответы [ 8 ]

63 голосов
/ 18 января 2010

Вы должны быть в состоянии сделать что-то подобное в своем блоке respond_to:

respond_to do |format|
    format.json 
    render :partial => "users/show.json"
end

, который будет отображать шаблон в app/views/users/_show.json.erb.

55 голосов
/ 18 января 2010

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

{
    "first_name": "<%= @user.first_name.to_json %>",
    "last_name": "<%= @user.last_name.to_json %>"
}
31 голосов
/ 18 июня 2013

Как уже упоминали другие, вам нужно представление 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

27 голосов
/ 29 августа 2011

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

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

https://github.com/nesquena/rabl

21 голосов
/ 31 декабря 2011

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

В 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 %>"
}
10 голосов
/ 18 января 2010

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

<%= @user.to_json %>

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

<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %>
6 голосов
/ 05 июня 2011

Это потенциально лучший вариант и быстрее, чем ERB: https://github.com/dewski/json_builder

0 голосов
/ 20 февраля 2019

Я новичок в RoR, это то, что я узнал. Вы можете напрямую визуализировать формат JSON

def YOUR_METHOD_HERE
  users = User.all
  render json: {allUsers: users} # ! rendering all users
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...