如何发送嵌套数据作为响应,rails4?

时间:2015-06-16 16:54:42

标签: ruby-on-rails ruby-on-rails-4

我正在使用轨道4.我有两个型号 - “公司”& “雇员”。公司拥有多名员工。我想获取公司并将所有员工放在API中的嵌套字典中,如下所示

  {"Company":{"name":"companyName",
             "total_employees":1000000,
             "Employees":[{"name":"xyz"},
                          {"name":"abc"}]}

在公司控制器中我试过

respond_with(Company.for(@current_user.id))

在公司模式中

scope :for, ->(id) do
 Employee.joins(:company).where(:company_id => id).to_a
end

并获得此输出

[{"name":"xyz"},{"name":"abc"}]

但我也需要公司的属性。请帮忙。

2 个答案:

答案 0 :(得分:1)

你应该尝试act_as_api(https://github.com/fabrik42/acts_as_api

使用这个gem你可以很容易地定义它:

class Company < ActiveRecord::Base
  acts_as_api

  has_many :employees

  api_accessible :public do |template|
    template.add :name
    template.add :employees
  end
end

class Employee < ActiveRecord::Base
  acts_as_api
  belongs_to :company

  api_accessible :public do |template|
    template.add :name
  end
end

并在控制器中呈现它:

    companies = Company.includes(:employees).where(id:1).first

    respond_to do |format|
        format.json {render_for_api  :public, json: companies}
    end

结果:

{"company":{"name":"companyName","employees":[{"name":"xyz"},{"name":"abc"}]}}

答案 1 :(得分:1)

这是您需要使用适当的响应构建器在视图中处理的内容。

虽然@rob建议使用acts_as_api,但从v4.0开始的Rails已经内置支持使用典型的构建器样式DSL构建和发送丰富的JSON响应。它被称为jbuilder - https://github.com/rails/jbuilder

就像您拥有.html.erb个视图一样,您可以在同一目录中定义.json.jbuilder个视图,并且您都可以创建任何类型的JSON响应。

jbuilder优于acts_as_api的特别优势是对partials的支持(类似于erb模板)以及响应逻辑将位于view而不是model的事实{1}}。

P.S:我使用acts_as_api,直到Rails在v4.0中添加了对jbuilder次观看支持