我需要在我的JSON响应中包含顶级节点,以便已部署的移动应用程序正常运行。我的模型是语言和帖子,帖子属于语言。应用程序需要的响应是:
{
"english": {
"posts": [
{
"title": "title",
"content": "content"
},
我的语言控制器代码如下所示:
@posts = @language.posts
render :json => { :posts => @posts.as_json
只需要将JSON中的语言提升到一级以上即可。在环境或deploy.rb中没有配置来处理这个吗?
由于
答案 0 :(得分:2)
为什么不使用JSON模板?然后你可以根据需要自定义它。
例如,在您的控制器中:
# app/controllers/posts_controller.rb
def show
@language = ...
@posts = ...
respond_to do |format|
format.json
end
end
然后在你的观点中,
/* app/views/posts/show.json.erb */
{
"<%= @language =>": {
"posts": <%= @posts.to_json.html_safe =>
}
}
我不确定以这种方式嵌套JSON是否会导致语法问题。或者,您也可以构建哈希,然后调用to_json
。例如,
def show
@language = ...
@posts = ...
render json: { @language => @posts }
end
答案 1 :(得分:1)
@language.as_json(:include => :posts)
会产生你想要的东西。
编辑:
class Language < ActiveRecord::Base
...
def to_json(opts = {})
{self.name => self.posts}.to_json(opts)
end
...
end
答案 2 :(得分:1)
如果您想在所有JSON响应中包含root,那么您可以直接前往config/initializers/wrap_parameters.rb
你会看到/或者如果没有,你可以添加
# To enable root element in JSON for ActiveRecord objects.
ActiveSupport.on_load(:active_record) do
self.include_root_in_json = true
end
或强>
如果这还不够,并且您想进一步自定义JSON数据,只需与active_model_serializers联系即可。您将在一分钟内获得自定义JSON响应,并且您不仅限于在视图/渲染中使用它们。