【问题标题】:I am trying to get a custom json in rails app to fetch nested user data and their post respectivelly but page is not displaying right content我正在尝试在 Rails 应用程序中获取自定义 json 以分别获取嵌套的用户数据及其帖子,但页面未显示正确的内容
【发布时间】:2019-06-01 09:51:39
【问题描述】:

我有 3 个模型用户,发帖和评论。 用户可以有多个 post 和 cmets。 我只需要为最后 50 个帖子生成 JSON。 我没有使用 rails 约定,所以我必须在 newsfeed_controller 中编写它。 感谢您的支持。

类 NewsfeedsController

def build
    @posts = Post.all.order("created_at DESC")
    render json: {:event => @posts}
end


def data
    @posts = Post.all.order("created_at DESC")
    render :partial => "newsfeeds/data.json"
end

private

def post_params
    params.require(:post).permit(:content)
end

def find_post
    @post = Post.find(params[:id])

end

结束

在视图中:data.json.erb

 <%= res = {
  :posts => @posts.map do |post|

  end
} %>

<% res.to_json.html_safe %>

路线:

get 'build' => 'newsfeeds#build'
get 'data' => 'newsfeeds#data', :defaults => { :format => 'json' }

表单构建我正在获取数据。 但我想要来自data.json 的自定义 json 格式,

我想要的响应格式:

[
  {
    "type": "Post",
    "content": "First post",
    "user": {
      "type": "User",
      "name": "Luke"
    },
    "comments": [
      {
        "type": "Comment",
        "user": {
          "type": "User",
          "name": "Leia"
        },
        "content": "First comment"
      },
      {
        "type": "Comment",
        "user": {
          "type": "User",
          "name": "Han"
        },
        "content": "Second comment"
      },
    ]
  },
  {
    "type": "Post",
    "content": "Second post",
    "user": {
      "type": "User",
      "name": "Darth Vader"
    },
    "comments": [
      {
        "type": "Comment",
        "user": {
          "type": "User",
          "name": "Boba Fett"
        },
        "content": "Third comment"
      },
      {
        "type": "Comment",
        "user": {
          "type": "User",
          "name": "Jabba"
        },
        "content": "Fourth comment"
      },
    ]
  }
]

请指导。

目前,我无法获得该格式。

【问题讨论】:

  • 您是否只是在您的.erb 文件中忽略了周围的&lt;%= %&gt;,还是您在原始文件中也忘记了它们?
  • 嗨,我已经对问题进行了更改并删除了不必要的代码。
  • 尝试在您的模板中切换&lt;%=&lt;%。前者用于将 Ruby 代码的结果实际渲染到模板中,而后者仅用于运行任意代码。
  • 给出空白页,我需要像上面提到的那样回复

标签: ruby-on-rails json ruby api render


【解决方案1】:

首先,您需要覆盖模型中的 to_json

app/models/post.rb

def to_json
  return {
    type: 'Post',
    content: self.content,
    user: self.user ? self.user.to_json : nil,
    comments: self.comments.map(&:to_json)
  }
end

app/models/user.rb

def to_json
  return {
    type: 'User',
    name: self.name
  }
end

app/models/comment.rb

def to_json
  return {
    type: 'Comment',
    content: self.content,
    user: self.user ? self.user.to_json : nil,
  }
end

然后在您的控制器中,执行以下操作:

def data
    @posts = Post.all.order("created_at DESC")
    render json: @posts.map(&:to_json), status: :ok
end

【讨论】:

  • 嗨,所有来的单行都没有换行符,[{"type":"Post","content":"ededed","user":{"type":"User","name":"aaa@aaa.aaa"},"comments":[]},{"type":"Post","content":"123sss","user":{"type":"User","name":"sss@sss.sss"},"comments":[{"type":"Comment","content":"werfefd","user":{"type":"User","name":"aaa@aaa.aaa"}}]},{"type":"Post","content":"aesrdtasdfdgfhjrdtuiuihkjhgfd","user":{"type":"User","name":"aaa@aaa.aaa"},"comments":[{"comments":[]}]
  • @AnshulEnbake 什么?意图是什么?
  • 我的意思是同一行,感谢您的支持。请指导如何制作该结构@RocKhalil
  • @AnshulEnbake 基本上,JSON 响应应该尽可能小;所以这是最优解。如果你想看到它美化,使用任何在线工具美化它 - 我个人使用jsonviewer.stack.hu
  • 嗨@RocKhalil 我怎样才能限制前50个帖子的json响应数据。
猜你喜欢
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多