Railsでログイン中のユーザーが記事にコメント出来るAPIを実装 

プログラミング
スポンサーリンク

概要

ログインしているユーザーが記事にコメントできるAPIを実装

.

テストはこちら
.

RSpecでコメント機能のAPIテストを実装 Rails
概要RSpecを使いコメント機能のAPIテストを実装.対応するコントローラーとルーティングはこちら.コメントモデルのテストはこちら.【 使用gem】・ gem "factory_bot_rails"テストデータの作...

.

【使用したgem】

  • devise_token_auth
    ログイン情報をtokenで認証

  • active_model_selializer
    JSONオブジェクトを作成するオブジェクトの作成を支援するライブラリ。
    今回の場合、Railsのビューは使わない。

実装手順

User, Article, Commentの3つのモデルが必要。
.

User, Articleはすでに作ってあるので
.

Commentモデルの作成から始める。
.

コメントのcontentstring型に指定。textでも可。
.

データベースにPostgresqlを使っているので
文字数制限の記述をしなければあまり違いはない。
.

mysqlだとstring型は255文字制限があるので
コメントの文字数の制限をしたくなければtext型が無難。
.

content:string

.

UserとArticleとはどちらも1対多の関係なので
.

user:references article:references

.
このように記述して外部キーを作る
.

$ be rails g model Comment content:string user:references article:references

.

各modelにアソシエーションを記述。
.

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  include DeviseTokenAuth::Concerns::User

  has_many :articles, dependent: :destroy
  has_many :comments, dependent: :destroy
end

.

class Article < ApplicationRecord
  belongs_to :user
  has_many :comments, dependent: :destroy
end

.

contentが空の場合エラーになるようにcommentモデルに記述。
.

validates :content, presence: true

.

class Comment < ApplicationRecord
  belongs_to :user
  belongs_to :article
  validates :content, presence: true
end

.

次にルーティングの設定をします。
.

Rails.application.routes.draw do
  namespace :v1 do
    mount_devise_token_auth_for "User", at: "auth", controllers: {
      registrations: "v1/auth/registrations",
    }
    resources :articles do
      resources :comments, controller: "articles/comments"
    end
  end
end

.

記事にコメントをするので
.

どの記事にコメントするのかURLでわかるように
.

ルーティングを変更する。
.

resources :articles配下にresources :commentsを記述。
.

その他ルーティングに関してはこちらの記事。
.

次にコントローラーを作成し
.

APIを実装していきます。
.

完成形がこちら。
.

class V1::Articles::CommentsController < V1::BaseApiController
  def index
    article = Article.find(params[:article_id])
    comments = article.comments
    render json: comments
  end

  def create
    article = Article.find(params[:article_id])
    comment = current_user.comments.new(comment_params)
    comment.article = article
    comment.save!
    render json: comment
  end

  def destroy
    comment = current_user.comments.find(params[:id])
    comment.destroy!
    render json: comment
  end

  def show
    comment = Comment.find(params[:id])
    render json: comment
  end

  def update
    comment = current_user.comments.find(params[:id])
    comment.update!(comment_params)
    render json: comment
  end

  private

    def comment_params
      params.require(:comment).permit(:content)
    end
end

.

indexメソッド

def index
    article = Article.find(params[:article_id])
    comments = article.comments
    render json: comments
end

.

article = Article.find(params[:article_id])で記事を指定。

.

comments = article.commentsで指定した記事のコメントを
.

commentsに代入。
.

render json: commentsでJSONで返すように設定。
.

createメソッド

def create
    article = Article.find(params[:article_id])
    comment = current_user.comments.new(comment_params)
    comment.article = article
    comment.save!
    render json: comment
  end

  private

    def comment_params
      params.require(:comment).permit(:content)
    end

.

コメントを作る時には
.

content,user_id,article_idが必要になる。
.

article = Article.find(params[:article_id])で記事を指定。
.

current_user.comments.new(comment_params)
.

ログインしているユーザーのコメントを作成。
.

contentuser_idが入る。
.

comment_paramsはストロングパラメーターで
.

commentモデルのcontentカラムだけ許可するように設定してある。
.

あと必要なのはarticle_idなので
.

comment.article = articleで設定。
.

comment.save!保存して
.

render json: commentJSONで返すように設定。
.

destroyメソッド

 def destroy
    comment = current_user.comments.find(params[:id])
    comment.destroy!
    render json: comment
end

.

コメントの削除機能は
.

ログインしているユーザーのコメントだけ削除できるようにする。
.

comment = current_user.comments.find(params[:id])
.

ログインしているユーザーのコメントを指定。
.

comment.destroy!削除して
render json: commentJSONで返すように設定。

showメソッド

def show
    comment = Comment.find(params[:id])
    render json: comment
end

コメントの詳細画面は
comment = Comment.find(params[:id])コメントを指定して
render json: commentJSONで返すように設定。

def update
    comment = current_user.comments.find(params[:id])
    comment.update!(comment_params)
    render json: comment
end

.

コメントの更新機能は
.
今まで出てきたやつを組み合わせて完了。
.

関連記事

RSpecでコメントモデルのテストを実装 Rails
概要コメントモデルのテストを実装【 使用gem】gem "factory_bot_rails"テストデータの作成を手伝ってくれるGemです。gem "faker"ダミーデータを作成するgem...
RSpecでコメント機能のAPIテストを実装 Rails
概要RSpecを使いコメント機能のAPIテストを実装.対応するコントローラーとルーティングはこちら.コメントモデルのテストはこちら.【 使用gem】・ gem "factory_bot_rails"テストデータの作...

コメント

タイトルとURLをコピーしました