LoginSignup
1
1

More than 3 years have passed since last update.

備忘録:Railsによるコメント機能実装

Posted at

はじめに

Rubu on Railsでオリジナルアプリを作成しています。そのアプリにコメント機能を実装しました。そのため忘れないように書き記します。

手順

・commentモデル、テーブルの作成
・commentsコントローラーとルーティングの設定
・各コントローラーのアクション設定

commentモデル、テーブルの作成

はじめに下記のようにターミナルでcommentモデルを作成します。

rails g model comment

その後マイグレーションファイルに、textカラムを追加します(このtextカラムにはコメントが保存されます)。

2020*********_create_comments.rb
class CreateComments < ActiveRecord::Migration[6.0]
  def change
    create_table :comments do |t|
      t.text :text, null: false
      t.references :user, foreign_key: true
      t.references :desk, foreign_key: true
      t.timestamps
    end
  end
end

userとdeskを外部キー設定します。このコメントは誰が、どのdesk(画像)にしたものか管理するためです。同様にcommentモデルにもバリデーションの他、アソシエーションを設定する必要があります。

desk.rb
  validates :text, presence: true
  belongs_to :user
  belongs_to :desk

userモデル、deskモデルにもアソシエーションを追加します。なお、今回のバリデーションはコメントが空だと保存できないような設定です。

commentsコントローラーとルーティングの設定

ターミナルでコメントのコントローラーを作成します。この時、コントローラー名は複数形にする(いつもどっちだっけ?って悩んでます😅)。

rails g controller comments

お次は作成したcommentsコントローラーにcreateアクションを設定します。このとき、中身は空で一旦OKです。

comments_controller.rb
def create
end

最後にルーティングを。コメントはdesk(画像)と紐付けします。なのでネスト(入れ子構造)にします。

route.rb
resources :desks do
    resources :comments, only: :create
end 

くどくなりますが、どの画像に対するコメントなのかをパスから判断できるようにすることが重要です。

各コントローラーのアクション設定

今回はdesks(画像)コントローラーのshowアクションに対するレスポンスページでコメント保存、表示します(元々このページは、投稿された画像の詳細ページです)。なので、まずはdeskコントローラーのshowアクションに@commentのインスタンス変数を定義します。

desks.controller.rb
def show
    @desk = Desk.find(params[:id])
    @comment = Comment.new
    @comments = @desk.comments
end

なお画像に付けられたコメントを一覧で表示するため。@commentsでコメントを取得しています。

今度はcommentsコントローラーへの設定です。こちらではストロングパラメータを設定します。requireにモデル名、permitに保存カラムを設定します。アソシエーション関係にあるものはmergeに記述します。なおdevise Gemがインストールされているので、current_userメソッドを使用しています。これによりコメントが誰が(user_id)、何に(desk_id)にされたものか管理できます。

comments.controller.rb
def create
    @comment = Comment.new(comment_params)
    if @comment.save
      redirect_to desk_path(@comment.desk)
    else
      @desk = @comment.desk
      @comments = @desk.comments
      render "desks/show"
    end
end
  private

  def comment_params
    params.require(:comment).permit(:text).merge(user_id: current_user.id, desk_id: params[:desk_id])
  end

以上

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1