5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Ruby on Rails】コメント機能実装

Last updated at Posted at 2020-09-04

目標

コメント.gif

開発環境

ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina

前提

※ ▶◯◯ を選択すると、説明等が出てきますので、
  よくわからない場合の参考にしていただければと思います。

テーブルの作成

ターミナル
$ rails g model Comment user:references post:references comment:string
ターミナル
$ rails db:migrate

モデルの修正

app/models/user.rb
has_many :comments, dependent: :destroy
app/models/post.rb
has_many :comments, dependent: :destroy
補足 userは複数のCommentモデル、postは複数のCommentモデルを保有するため、 has_many。 またuser、postがなくなった時はcommentも残す必要はないため、 dependent: :destroy。
# コントローラーの作成
ターミナル
$ rails g controller comments create destroy
app/controllers/comments_controller.rb
class CommentsController < ApplicationController
  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.new(comment_params)
    @comment.user_id = current_user.id
    if @comment.save
      redirect_to request.referer
    else
      @post_new = Book.new
      @comments = @post.comments
      redirect_to new_post_path
    end
  end

  def destroy
    @post = Post.find(params[:post_id])
    @comment = Comment.find(params[:id])
    @comment.destroy
    redirect_to request.referer
  end

  private

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

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

ルーティングの修正

config/routes.rb
  resources :posts, except: [:index] do
    resources :comments, only: [:create, :destroy]
  end
補足1 上記記述はネストさせています。 ネストについては[こちら](https://qiita.com/chopesu_se/items/c7362380865cf978b158)がわかりやすかったです。
補足2 exceptは除くという意味なので、index以外のアクションを定義しています。
# viewsの変更 ```erb:app/views/show.html.erb

Posts#show

現在ログイン中のユーザー:<%= current_user.name %>
投稿者名 タイトル 本文
<%= @post.user.name %> <%= @post.title %> <%= @post.body %> <%= link_to "編集", edit_post_path(@post) %>

<%= form_for [@post, @comment] do |f| %>
<%= f.text_area :comment, size: "40x5" %>
<%= f.submit '送信', class: "btn-sm btn-primary" %>
<% end %>

<% @comments.each do |comment| %> <% end %>
コメント投稿者 コメント内容
<%= comment.user.name %> <%= comment.comment %> <%= link_to "削除", post_comment_path(@post, comment), method: :delete %>
```
app/views/new.html.erb
<table>
  <thead>
    <tr>
      <th>投稿者名</th>
      <th>タイトル</th>
      <th>本文</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <% @posts.each do |post| %>
      <tr>
        <td><%= post.user.name %></td>
        <td><%= post.title %></td>
        <td><%= post.body %></td>
        <td><%= link_to "詳細", post_path(post) %></td>
        <td><%= link_to "編集", edit_post_path(post) %></td>
        <td><%= link_to "削除", post_path(post), method: :delete %></td>
      </tr>
    <% end %>
  </tbody>
</table>

目標完成。

5
7
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
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?