问题
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