Ruby on rails 如何在rails中的ruby中创建复杂的Json响应
我正在从事RubyonRails项目,我想添加对Json的响应 一个简单的方法是:-- 但这方面存在一些问题:-Ruby on rails 如何在rails中的ruby中创建复杂的Json响应,ruby-on-rails,ruby,json,ruby-on-rails-3,Ruby On Rails,Ruby,Json,Ruby On Rails 3,我正在从事RubyonRails项目,我想添加对Json的响应 一个简单的方法是:-- 但这方面存在一些问题:- 我不想在json响应中给出整个用户对象,比如密码散列和缓存计数器属性。Facebook、twitter属性等 我想在json对象中添加更多细节(考虑stackoverflow模型),比如每个用户提出的最新问题,每个用户给出的最新答案。我想传递图像的完整url,而不是通过回形针存储在db中的图像名称 因此,问题是如何在index.json.erb文件中编写json响应,就像我们在ind
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
[ { 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 } ]
index.json.erb文件:-
<% @users.each do |user| %>
{
first_name: <%= user.first_name %>,
last_name: <%= user.last_name %>
}
<% end %>
编辑
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
[ { 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 %>
]
现在我只想把每个响应部分都包含在用户数组中,格式化是最简单的部分,但我相信您的要求应该在控制器中实现,而不是在您的视图中实现
请参阅并了解如何更好地使用
来_json
实际输出所需内容,而不是序列化整个对象。您可以呈现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 %>
}
您可以通过在模型中实现代码来自定义输出:
def as_json(options={})
super(:only => [:name, :email])
end
然后在控制器中,您可以使用:
render :json => @user
有关更多信息,请参见“”。您可以发送JSON格式的选项,用于:
(明确的属性列表):仅
(属性排除列表):除
(执行并包含其内容的方法列表):方法
(关系):包括
as_JSON
方法中(请参阅Devin的答案):
查看,以自定义您的视图:
# 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您希望在用户模型中看到什么:-关系?或者属性?很抱歉,我没有完全阅读您的问题,但是对于第一个部分问题,您可以使用:only和:except散列来过滤内容。您还可以使用:include包含来自其他表的数据。我不知道如何在不使用JSON gem的情况下轻松修改数据。您可以从对象生成散列,并将其他所需字段(键)添加到此散列中,然后将此散列传递给render:json=>您的\u散列,而无需显式告诉。我有一篇关于在不使用erb文件的情况下创建xml响应的博文。我相信它可以解决您的问题:JSON是一种数据结构,与视图无关,所以我认为通过erb生成JSON没有任何意义。这可能是一个很好的例子,我不建议使用JSON数据模板。有一些构建器是为了避免重复使用JSON结构模板而设计的。奇怪的是,即使我提供了用户要求的内容,我也投了反对票:-]@Victor Moroz:我已经回答了用户要求的内容。如果我只需要在一个响应上呈现json,那么在使用视图时我看不到任何问题。Rails之所以有as_json是有原因的,它比人类更擅长创建json。你的代码在任何情况下都是无用的,除非你需要一些奇怪的不符合标准的JSON,即使它满足了用户的要求,重新发明轮子也绝对不是一个好的做法。如果我想对一些数据进行一些计算怎么办。是否可以在index.json.erb中生成。如果是,那怎么办?任何5分钟的视频屏幕将@user放到您想要的位置,然后进行渲染。(先执行计算,然后作为json返回)@RadioTukTuk:没问题。有一个名为image_url的方法,它利用回形针(或carrierwave等)为您创建url。to_json方法的可用选项的精彩总结。为了让to_json方法起作用,我必须将它用括号(上面的代码:花括号和缺少结束括号)括起来,就像这样:
format.json{render:json=>@users.to_json(:only=>[:name,:email,:id],:methods=>[:last_question_responsed],:include=>[:profile])
我强烈认为这应该是选择的答案。
format.json { render :json => @users.to_json{:only=>[:name, :email, :id], :methods=>[:last_question_answered], :include=>[:profile] }
# 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
}
}]