我正在使用轨道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"}]
但我也需要公司的属性。请帮忙。
答案 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
次观看支持