Programming Journal

学習したことの整理用です。

掲示板にコメント機能を実装する①Commentモデルの作成と他モデルの関連付け

掲示板にコメントを書き込めるように実装する

  • 掲示板一覧から掲示板詳細画面へ遷移すると、その掲示板についてコメントを書き込めるようにしたい

  • 書き込んだコメントは、同じページの下部に更新順に表示される

  • コメントを削除・編集できるのは、コメントした本人だけに制限する(今回はビュー側の設定まで)

f:id:Study-Diary:20200810200844p:plain
掲示板詳細画面

コメント機能を実装するために必要な作業

とりあえず、ざっくりと書き出してみる

  • Commentモデルと他モデル(User, Board)への関連付け

  • ルーティング設定

  • comments_controllerの作成とboards_controllerへの追記(掲示板詳細ページにコメントを表示したいので、showアクションへ追記)

  • 掲示板詳細画面、コメントフォーム、コメント一覧画面の作成。掲示板詳細画面(show)にそれぞれ、パーシャルで表示する。

  • コメントを作成した人だけが、削除・編集アイコンを見られるようにする。

Commentモデルの作成と関連付け

UserとBoardモデルに関連を持たせたいので、referencesで指定しておく。

$ rails g model Comment body:text user:references board:references

class CreateComments < ActiveRecord::Migration[5.2]
  def change
    create_table :comments do |t|
      t.text :body, limit: 65535, null: false
      t.references :user, foreign_key: true
      t.references :board, foreign_key: true

      t.timestamps
    end
  end
end
  • 外部キーあることを確認

  • 文字数制限を付けたいので、limit: 65535追加

  • 空で登録できないように、null: false追加

内容がOKだったら、$ rails db:migrate

各モデルに関連付けしていく

まず、Commentモデルに追記

rails generateしたときに、referencesで設定したので、自動でbelongs_to :user belongs_to :boardが設定されている。

空が登録できないようにする&文字数制限も追記。

class Comment < ApplicationRecord
  belongs_to :user
  belongs_to :board
  validates :body, presence: true, length: { maximum: 65_535 }
end

Userモデル、 Boardモデルにそれぞれ、以下を追記する。

has_many :comments, dependent: :destroy

参考 Active Record の関連付け - Railsガイド

次回以降も進めていく。