←Rails 6で認証認可入り掲示板APIを構築する #8 seed実装
ActiveModelSerializerの導入
serializerを入れることで、jsonで返されるデータを簡単に整形できます。
Gemfile
...
+ # serializer
+ gem "active_model_serializers"
$ bundle
設定ファイルとserializerの編集
導入できたらpostモデルのserializerと、ActiveModelSerializerの設定ファイルも作ります。
$ rails g serializer post
$ touch config/initializers/active_model_serializer.rb
app/serializers/post_serializer.rb
# frozen_string_literal: true
#
# post serializer
#
class PostSerializer < ActiveModel::Serializer
attributes :id
end
config/initializers/active_model_serializer.rb
# frozen_string_literal: true
ActiveModelSerializers.config.adapter = :json
app/controllers/v1/posts_controller.rb
def index
posts = Post.order(created_at: :desc).limit(20)
- render json: { posts: posts }
+ render json: posts
end
def show
- render json: { post: @post }
+ render json: @post
end
def create
post = Post.new(post_params)
if post.save
- render json: { post: post }
+ render json: post
else
render json: { errors: post.errors }
end
@@ -27,7 +27,7 @@ module V1
def update
if @post.update(post_params)
- render json: { post: @post }
+ render json: @post
else
render json: { errors: @post.errors }
end
@@ -35,7 +35,7 @@ module V1
def destroy
@post.destroy
- render json: { post: @post }
+ render json: @post
end
一旦ここまでやったらrails s
を止めて、再起動しましょう。
curlで確認
$ curl localhost:8080/v1/posts
{"posts":[{"id":20},{"id":19},{"id":18},{"id":17},{"id":16},{"id":15},{"id":14},{"id":13},{"id":12},{"id":11},{"id":10},{"id":9},{"id":8},{"id":7},{"id":6},{"id":5},{"id":4},{"id":3},{"id":2},{"id":1}]}
$ curl localhost:8080/v1/posts/1
{"post":{"id":1}}
serializerでidのみにしているので、idの一覧が取得できました。
それではsubject, bodyを追加してみます。
app/serializers/post_serializer.rb
# frozen_string_literal: true
#
# post serializer
#
class PostSerializer < ActiveModel::Serializer
- attributes :id
+ attributes :id, :subject, :body
end
$ curl localhost:8080/v1/posts
{"posts":[{"id":20,"subject":"無駄","body":"ハチのすさいぼうかっこう。暴力血液恨み。秘めるちゅうもんする廃墟。"},...
curl localhost:8080/v1/posts/1
{"post":{"id":1,"subject":"hello","body":"警官総括大尉。めいしぼきんかたみち。伝統徳川超〜。
正常に動いていそうですね。
rubocopとrspecも動かして、問題なければcommitしておきましょう。