Ruby on rails 如何在rails中的ruby中创建复杂的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

我正在从事RubyonRails项目,我想添加对Json的响应

一个简单的方法是:--

但这方面存在一些问题:-

  • 我不想在json响应中给出整个用户对象,比如密码散列和缓存计数器属性。Facebook、twitter属性等
  • 我想在json对象中添加更多细节(考虑stackoverflow模型),比如每个用户提出的最新问题,每个用户给出的最新答案。我想传递图像的完整url,而不是通过回形针存储在db中的图像名称 因此,问题是如何在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
    
        [ { 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格式的选项,用于:

    • :仅
      (明确的属性列表)
    • :除
      (属性排除列表)
    • :方法
      (执行并包含其内容的方法列表)
    • :包括
      (关系)
    如果您希望始终使用此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
      }
    }]