如何在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 

但也有一些问题,这一点: -

  1. 我不希望给像密码哈希JSON响应整个用户对象和缓存计数器属性。 Facebook,Twitter的属性等
  2. 我想添加更多的细节在json对象(考虑*模型)像每个用户最新问题,每个用户给出的最新答案。而不是通过回形针存储在数据库中的图像名称,我想传递图像的完整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 } ] 

编辑,发现相当接近了解决办法: -

[ 
    <% @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" 
     } 

    ] 

现在我想的是附上用户阵列这个每个响应部分

+0

@YetAnotherGeek你想在用户模型中看到什么: - 关系?或属性? – 2011-06-14 14:49:39

+1

对不起,我没有完全阅读你的问题,关于第一个部分问题,你可以使用:only和:除了散列来过滤掉内容。您还可以使用include包含来自其他表的数据。我不知道如何轻松修改数据,但不使用JSON gem。 [链接](http://apidock.com/rails/ActiveRecord/Serialization/to_json)。 – 2011-06-14 14:51:51

+0

你可以从你的对象生成哈希,并将其他所需的字段(键)添加到这个哈希 - 然后通过这个哈希来渲染:json => your_hash没有明确告诉.to_json哈希 – bor1s 2011-06-14 14:52:50

你可以渲染一个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' 
+0

这就是它?(15个字符) – 2011-06-14 14:54:25

+0

你知道任何5分钟的视频吗? – 2011-06-14 14:55:04

+0

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

+1模型关注留在模型中。 – 2011-06-14 17:37:33

+1

这实际上应该如何完成。 – 2011-07-13 08:09:57

+2

+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] } 
+0

如果我想对某些数据进行一些计算,该怎么办。是否有可能在index.json.erb中生成。如果是,那么如何?任何5分钟视频屏幕视频 – 2011-06-14 15:03:32

+1

将您的@user放到您想要的位置,然后进行渲染。 (先执行计算,然后返回为json) – 2011-06-14 15:08:05

+0

问题是如果我想发送图像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 
    } 
}]