为什么rails不生成对象类型

时间:2013-03-22 00:47:39

标签: ruby-on-rails ruby json ruby-on-rails-3

由于某种原因,我的控制器创建的任何json都会生成一个json数组,但不会生成一个对象。我想知道它的正常行为吗?如果它我怎样才能获得我想要的东西。

控制器

def index
  @articles = Article.all
  respond_to do |format|
    format.json  { render :json => @events }
  end
end

现在我真正得到的是

[{"allday":true,"created_at":"2013-01-10T23:49:19Z","customer_id":1,"description":"A meeting tomorrow between Prime Minister","id":35}]

现在然而我想首先看到标准json的对象跟随

{ "Article":{"allday":true,"created_at":"2013-01-10T23:49:19Z","customer_id":1,"description":"A meeting tomorrow between Prime Minister","id":35}}

2 个答案:

答案 0 :(得分:1)

您可以构建一个ruby对象或哈希,它反映您想要的json对象的结构并进行渲染。

def index
  @articles = Article.all
  respond_to do |format|
    format.json  { render :json => @events.map { |e| { Article: e } } }
  end
end

这会给你类似的东西

[{ "Article":{"allday":true,"created_at":"2013-01-10T23:49:19Z","customer_id":1,"description":"A meeting tomorrow between Prime Minister","id":35}}]

答案 1 :(得分:1)

您应该启用ActiveRecord::Base.include_root_in_json以获得全局所需的行为。来自the docs

  

选项include_root_in_json控制的顶级行为   as_json。如果为true(默认值)as_json将发出单个根节点   以对象的类型命名。例如:

user = User.find(1)
user.as_json
# => { "user": {"id": 1, "name": "Konata Izumi", "age": 16,
#               "created_at": "2006/08/01", "awesome": true} }

ActiveRecord::Base.include_root_in_json = false

user.as_json
# => {"id": 1, "name": "Konata Izumi", "age": 16,
#     "created_at": "2006/08/01", "awesome": true}
     

也可以通过将:root选项设置为false来实现此行为,如下所示:

user = User.find(1)
user.as_json(root: false)
# =>  {"id": 1, "name": "Konata Izumi", "age": 16,
#      "created_at": "2006/08/01", "awesome": true}