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

倾然丶 夕夏残阳落幕 提交于 2019-12-13 04:16:46

问题


I have 3 model user, post and comment. the user can have multiple post and comments. I need to produce the JSON for last 50 post only. I am not using rails convention, so i have to write that in neewsfeed_controller. Thank for the support.

class NewsfeedsController < ApplicationController respond_to :json

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

end

In View: data.json.erb

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

  end
} %>

<% res.to_json.html_safe %>

Routes:

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

Form build i am getting data. but i want custom json format from data.json,

Response Format which i want :

[
  {
    "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"
      },
    ]
  }
]

Please guide.

Currently, I am not able to get that format.


回答1:


First, you'll need to override the to_json in your models:

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

Then in your controller, do something like:

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


来源:https://stackoverflow.com/questions/54062410/i-am-trying-to-get-a-custom-json-in-rails-app-to-fetch-nested-user-data-and-thei

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!