ruby-on-rails 如何在Ruby on Rails中创建复杂的JSON响应?

f5emj3cl  于 2023-02-26  发布在  Ruby
关注(0)|答案(5)|浏览(207)

我正在进行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,twitter属性等等。
1.我想在json对象中添加更多的细节(考虑stackoverflow模型),比如每个用户最新的问题,每个用户最新的答案,而不是通过回形针存储在数据库中的图像名称,我想传递图像的完整URL。
所以问题是如何在index.json.erb文件中编写json响应,就像我们在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

索引. 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"
       }

    ]

现在我所要做的就是将每个响应部分包含在用户数组中

zpf6vheq

zpf6vheq1#

您可以通过在模型中实现以下代码来定制输出:

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

然后,在控制器中,您可以用途:

render :json => @user

有关详细信息,请参见“Rails to_json or as_json?“。

epfja78i

epfja78i2#

您可以呈现一个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'
dtcbnfnu

dtcbnfnu3#

您可以发送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] }
xa9qqrwz

xa9qqrwz4#

查看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
  }
}]
holgip5t

holgip5t5#

格式化是容易的部分,但我相信你所要求的,应该在控制器内实现,而不是在你的视图中。
请参阅http://ar.rubyonrails.org/classes/ActiveRecord/Serialization.html#M000049,了解如何更好地使用to_json来实际输出所需的内容,而不是序列化整个对象。

相关问题