【Comment】 rails コメント機能実装


【ゴール】

コメント機能の実装
 → コメントの表示
 → コメント件数の表示

参考:https://qiita.com/__kotaro_/items/8a6bda99dab61d2a72a5

【メリット】

■ アプリケーションの完成度が増す
■ UX向上

【開発環境】

■ Mac OS catalina
■ Ruby on Rails (5.2.4.2)
■ Virtual Box:6.1
■ Vagrant: 2.2.7

【実装】

まず、アプリケーション作成

1.commentモデル作成
※DBに記録するので必須

mac.terminal
$ rails g model Comment 

2.modelへアソシエーション 追記
 ※ user : comment = 1 : X (1対多)
 ※ post : comment = 1 : X (1対多)

models/post.rb
has_many :comments ,dependent: :destroy
models/user.rb
has_many :comments , dependent: :destroy
modles/comment.rb
belongs_to :user
belongs_to :post , optional: true

2.comments controller 作成
 ※ 今回は作成のみ、createアクションも同時に作成 ①
 ※ "build"メソッドで紐付いたものも難なく作成 ②
 ※ "user"を認識させてあげる ③

mac.terminal
$ rails g controller Commnets create  #①
posts_controller.rb
 class CommentsController < ApplicationController
    before_action :authenticate_user!

    def create
        @post = Post.find(params[:post_id])
        @comment = @post.comments.build(comment_params)  #②
        @comment.user_id = current_user.id  #③
        if @comment.save
            flash[:success] = "コメントを投稿しました"
            redirect_back(fallback_location: root_path)
        else
            flash[:unsuccess] = "コメントを投稿できませんでした"
            redirect_back(fallback_location: root_path)
        end
    end

    private
    def comment_params
        params.require(:comment).permit(:text)
    end

※今回は"post/show"で記述しているので、追加で記述要

posts_controller.rb
    def show
        @post =Post.find(params[:id])
        @comment = Comment.new
        @comments = @post.comments.all

3.view 記述
 ※"form_for"の際には"@post","@comment"両方に情報を!!

views/posts/show.html.erb
<%= form_for [@post , @comment] do |f| %> #コメント送信フォーム
  <%= f.text_area :text %>
  <%= f.submit "Comment"%>
<% end %>

          (中略)

<% @comments.each do |c| %> #コメント表示
  <%= c.text %>
  <%= c.user.name %>
  <%= c.created_at %>
<% end %>

以上