如何在rails中的ruby中创建复杂的Json响应
我在ruby on rails项目上工作,我想为Json添加响应。如何在rails中的ruby中创建复杂的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模型)像每个用户最新问题,每个用户给出的最新答案。而不是通过回形针存储在数据库中的图像名称,我想传递图像的完整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: - 我只是尝试使用创建此文件。这仅仅是一个样品
编辑
编辑
{ { 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 } ]
编辑,发现相当接近了解决办法: -
[
<% @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"
}
]
现在我想的是附上用户阵列这个每个响应部分
你可以渲染一个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'
这就是它?(15个字符) – 2011-06-14 14:54:25
你知道任何5分钟的视频吗? – 2011-06-14 14:55:04
JSON是一个数据结构,而不是视图相关,所以我不认为通过erb生成json是有意义的。这可能是一个很好的例子,如何不做事情。 – 2011-06-14 14:56:14
格式是简单的部分,但我相信你所要求的,应该在控制者内而不是你认为的内部实现。
请参阅http://ar.rubyonrails.org/classes/ActiveRecord/Serialization.html#M000049,看看如何更好地使用to_json
来实际输出所需内容,而不是让整个对象序列化。
您可以通过在模型执行的代码定制输出:
def as_json(options={})
super(:only => [:name, :email])
end
然后在你的控制器,你可以使用:
render :json => @user
有关更多信息,请参阅“Rails to_json or as_json?”。
+1模型关注留在模型中。 – 2011-06-14 17:37:33
这实际上应该如何完成。 – 2011-07-13 08:09:57
+1。这应该是答案。 – GeorgeW 2012-12-14 12:58:54
您可以发送选项的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] }
如果我想对某些数据进行一些计算,该怎么办。是否有可能在index.json.erb中生成。如果是,那么如何?任何5分钟视频屏幕视频 – 2011-06-14 15:03:32
将您的@user放到您想要的位置,然后进行渲染。 (先执行计算,然后返回为json) – 2011-06-14 15:08:05
问题是如果我想发送图像url而不是图像名称。 – 2011-06-15 14:18:19
看看到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
}
}]
@YetAnotherGeek你想在用户模型中看到什么: - 关系?或属性? – 2011-06-14 14:49:39
对不起,我没有完全阅读你的问题,关于第一个部分问题,你可以使用:only和:除了散列来过滤掉内容。您还可以使用include包含来自其他表的数据。我不知道如何轻松修改数据,但不使用JSON gem。 [链接](http://apidock.com/rails/ActiveRecord/Serialization/to_json)。 – 2011-06-14 14:51:51
你可以从你的对象生成哈希,并将其他所需的字段(键)添加到这个哈希 - 然后通过这个哈希来渲染:json => your_hash没有明确告诉.to_json哈希 – bor1s 2011-06-14 14:52:50