Rails:在jbuilder中隐藏内部对象的属性,并在jbuilder中显示has_many的属性

时间:2015-09-07 23:31:23

标签: ruby-on-rails json

我发布了以下JSON的帖子:

{  
   "comments":[  
      {  
         "created_at":"2015-09-07T23:04:46.000Z",
         "id":2,
         "post_id":32,
         "text":"sdfsdfdsf",
         "updated_at":"2015-09-07T23:04:46.000Z",
         "user_id":13
      }
   ],
   "id":32,
   "text":"xxxx",
   "user":{  
      "college_id":1,
      "created_at":"2015-09-06T21:37:06.000Z",
      "email":"mhewedy@hotmail.com",
      "gender":"m",
      "id":14,
      "name":"mhewedy",
      "password_digest":"$2a$10$shb6XUFtYnm0ctCPMEb88eDyXmw/jnhDMN65GVPr9Z19DalfOGJzC",
      "university_id":4,
      "updated_at":"2015-09-07T18:42:10.000Z",
      "user_type":"student",
      "username":"mhewedy5"
   }
}

Post属于UserPost有多个comments,其中每条评论属于User(直接)。

我想在User下显示comments对象,并隐藏password_digestUser的{​​{1}}个对象中的Post字段}。

我正在使用以下jbuilder文件:

Comment

P.S。我找不到足够的jbuilder在线资源。

2 个答案:

答案 0 :(得分:1)

您可以使用another syntax来构建嵌套的JSON:

yourJSON = Jbuilder.new do |j|
  j.id @post.id
  j.text @post.text
  #(... other @post attributes ...)
  j.user do
    j.id @post.user.id
    j.email @post.user.email
    #(... other @post.user attributes ...)
  end
  j.comments @post.comments.each do |aComment|
    j.id aComment.id
    j.text aComment.text
    #(... other Comment attributes ...)
  end
end

render json: yourJSON.target!

这将生成以下JSON:

{
 id:1,
 text:"Post text",
 //(...)
 user: {
     id: 30,
     email: "user@email.com",
     //(...)
   },
comments[
    {
       id:2002
       text:"this is the comment text",
       //(...) 
    },
    {
       id:2003
       text:"this is the comment text",
       //(...) 
    },
    //(... other comments here ...) 
  ]
}

答案 1 :(得分:1)

在RailsCasts的帮助下修复:https://github.com/railscasts/320-jbuilder/blob/master/blog-after/app/views/articles/show.json.jbuilder

在此处观看有关RailsCasts的视频:http://railscasts.com/episodes/320-jbuilder

DECLARE @tbl TABLE (val float)
INSERT INTO @tbl SELECT 1234.567
INSERT INTO @tbl SELECT 1234.5678
INSERT INTO @tbl SELECT -1234.5678
INSERT INTO @tbl SELECT 1234.56789

SELECT *
from @tbl
where (((abs(val)*10000) - CONVERT(INT,(abs(val)*10000))) <> 0)