Как создать сложный ответ Json в ruby ​​в рельсах - PullRequest
17 голосов
/ 14 июня 2011

Я работаю над проектом ruby ​​on rails и хочу добавить ответ Json.

Один простой способ: -

def index
  @users = User.all
  respond_to do |format|
    format.html # index.html.erb
    format.xml  { render :xml => @users }
    format.json  { render :json => @users.to_json }
  end
end

Но есть некоторые проблемы с этим: -

  1. Я не хочу указывать весь пользовательский объект в ответе json, например атрибуты хэша пароля и счетчика кэша. Facebook, атрибуты твиттера и т. Д.
  2. Я хочу добавить больше деталей в объект json (с учетом модели stackoverflow), например, Последний вопрос каждого пользователя, последний ответ каждого пользователя. Вместо имени изображения, хранящегося в БД с помощью скрепки, я хочу передать полный URL-адрес изображения.

Таким образом, вопрос заключается в том, как код json reponse в файле index.json.erb, как мы делаем в index.html.erb. Отформатируйте свой собственный ответ json согласно потребностям.

EDIT

def index
  @users = User.all
  respond_to do |format|
    format.html # index.html.erb
    format.xml  { render :xml => @users }
    format.json  { render :file => "index.json.erb", :content_type => 'application/json' }
  end
end

index.json.erb файл: -

    <% @users.each do |user| %>
    {
      first_name: <%= user.first_name %>,
      last_name: <%= user.last_name %>  
    }

    <% end %>

Ошибка: -

шаблон отсутствует.

PS: - Я просто пытаюсь создать этот файл. Это всего лишь образец

EDIT

enter image description here

редактировать

 { { first_name: Mohit , last_name: Jain } { first_name: Sahil Miglani, last_name: } { first_name: Hitesh Bansal, last_name: } { first_name: Sudhanshu, last_name: } { first_name: Saakshi, last_name: } { first_name: Kutta, last_name: } { first_name: bc, last_name: } { first_name: hey, last_name: } { first_name: fewhjfbwfb, last_name: vdsv } } 

EDIT

    [ { first_name: Mohit , last_name: Jain } , { first_name: Sahil Miglani, last_name: } , { first_name: Hitesh Bansal, last_name: } , { first_name: Sudhanshu, last_name: } , { first_name: Saakshi, last_name: } , { first_name: Kutta, last_name: } , { first_name: bc, last_name: } , { first_name: hey, last_name: } , { first_name: fewhjfbwfb, last_name: vdsv } ] 

РЕДАКТИРОВАТЬ, довольно близко, чтобы найти решение: -

    [
    <% @users.each_with_index do |user,index| %>
    {
        <%= "first_name".to_json.html_safe %>: <%= user.first_name.to_json.html_safe %>,
        <%= "last_name".to_json.html_safe %>: <%= user.last_name.to_json.html_safe %>  
    }
    <% unless index== @users.count - 1%>
    ,
    <% end %>
    <% end %>
    ]

Ответ: -

    [

       -
       {
           first_name: "Mohit "
           last_name: "Jain"
       }
       -
       {
           first_name: "Sahil Miglani"
           last_name: null
       }
       -
       {
           first_name: "Hitesh Bansal"
           last_name: null
       }
       -
       {
           first_name: "Sudhanshu"
           last_name: null
       }
       -
       {
           first_name: "Saakshi"
           last_name: null
       }
       -
       {
           first_name: "Kutta"
           last_name: null
       }
       -
       {
           first_name: "bc"
           last_name: null
       }
       -
       {
           first_name: "hey"
           last_name: null
       }
       -
       {
           first_name: "fewhjfbwfb"
           last_name: "vdsv"
       }

    ]

Теперь все, что я хочу, это включить каждый раздел ответа в пользовательский массив

Ответы [ 5 ]

35 голосов
/ 14 июня 2011

Вы можете настроить вывод, внедрив код в вашей модели:

def as_json(options={})
  super(:only => [:name, :email])
end

Тогда в вашем контроллере вы можете использовать:

render :json => @user

См. " Rails to_json или as_json? " для получения дополнительной информации.

20 голосов
/ 14 июня 2011

Вы можете визуализировать файл json.erb и использовать его как обычный шаблон:

# file: app/views/your_controller/your_action.json.erb
{
  filed1: <%= @some_var %>,
  field2: <%= @another_var %>,
  fieldN: <%= @yet_another_var %>,
  data: <%= @some_data.to_json.html_safe %>
}

в вашем контроллере вызовите явный рендер с content_type:

render :file => "your_file.json.erb", :content_type => 'application/json'
11 голосов
/ 14 июня 2011

Параметры для формата JSON можно отправить для:

  • :only (явный список атрибутов)
  • :except (список исключений атрибутов)
  • :methods (список методов, которые выполняются и включают их содержимое)
  • :include (отношения)

Если вы хотите всегда использовать это форматирование вывода JSON, поместите их вas_json метод (см. ответ Девина):

format.json  { render :json => @users.to_json{:only=>[:name, :email, :id], :methods=>[:last_question_answered], :include=>[:profile] }
5 голосов
/ 14 июня 2011

Взгляните на rabl gem , чтобы настроить свой вид:

# app/views/posts/index.rabl
collection @posts
attributes :id, :title, :subject
child(:user) { attributes :full_name }
node(:read) { |post| post.read_by?(@user) }

, который будет генерировать:

[{  post :
  {
    id : 5, title: "...", subject: "...",
    user : { full_name : "..." },
    read : true
  }
}]
0 голосов
/ 14 июня 2011

Форматирование - это простая часть, но я считаю, что то, что вы просите, должно быть достигнуто в контроллере, а не на ваш взгляд.

Обратитесь к http://ar.rubyonrails.org/classes/ActiveRecord/Serialization.html#M000049 и узнайте, как можно лучше использовать to_json для вывода именно того, что вам нужно, а не для сериализации всего объекта.

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