Как создать сложный ответ Json в рубине в рельсах
Я работаю над проектом 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
Но есть некоторые проблемы с этим: -
- Я не хочу давать весь пользовательский объект в json-ответе, как атрибуты хэша паролей и кеша. Facebook, атрибуты twitter и т.д.
- Я хочу добавить более подробную информацию в объект json (с учетом модели stackoverflow), такой как Последний вопрос каждым пользователем, последний ответ, заданный каждым пользователем. Вместо имени изображения, хранящегося в db через paperclip, я хочу передать полный URL-адрес изображения.
Итак, вопрос в том, как код json ответить в файле index.json.erb, как мы делаем в index.html.erb. Отформатируйте свой собственный ответ json в соответствии с потребностями.
ИЗМЕНИТЬ
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: - Я просто пытаюсь создать этот файл. Это всего лишь образец
ИЗМЕНИТЬ
![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 } }
ИЗМЕНИТЬ
[ { 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, достаточно близко, чтобы найти решение: -
[
<% @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"
}
]
Теперь все, что я хочу, заключить в каждую секцию ответа в пользовательском массиве
Ответы
Ответ 1
Вы можете отобразить файл 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'
Ответ 2
Вы можете настроить вывод, выполнив код в своей модели:
def as_json(options={})
super(:only => [:name, :email])
end
Затем в вашем контроллере вы можете использовать:
render :json => @user
Подробнее см. Rails to_json или as_json?".
Ответ 3
Вы можете отправить параметры для формата JSON для:
-
:only
(явный список атрибутов)
-
:except
(список исключений атрибутов)
-
:methods
(список методов выполнения и включение их содержимого)
-
:include
(отношения)
Если вы хотите всегда использовать это форматирование вывода JSON, поместите их в метод as_json
(см. ответ Devin):
format.json { render :json => @users.to_json{:only=>[:name, :email, :id], :methods=>[:last_question_answered], :include=>[:profile] }
Ответ 4
Посмотрите 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
}
}]
Ответ 5
Форматирование - это легкая часть, но я считаю, что то, о чем вы просите, должно быть достигнуто в контроллере, а не в вашем представлении.
Обратитесь к http://ar.rubyonrails.org/classes/ActiveRecord/Serialization.html#M000049 и посмотрите, как вы можете использовать to_json
лучше для вывода только того, что вам нужно, а не для всего объекта сериализованная.