目標
開発環境
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以外のアクションを定義しています。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 %>
コメント投稿者 | コメント内容 | |
---|---|---|
<%= 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>
目標完成。