※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。
コメント機能の実装をする
前回までで、urlの作成までが完了
routes.rbでルーティングの設定をしたので、controllerでアクションを設定する
app/controllers/comments.controller.rbのファイルを新たに作る
- pathから、「
:article_id
」を取得(params
)できる Article
から「:article_id
」に一致する記事を探す(find
)- 該当の記事を
article
とする article.comments.build
にて空の@comment
を作る
class CommentsController < ApplicationController
def new
article = Article.find(params[:article_id])
@comment = article.comments.build
end
end
記事を新規作成するときとやっていることは同じ
app/views/comments/new.html.hamlのファイルを新しく作る
コメントの投稿をするので、「POST」リクエストのpathを使う
引数に(@comment.article)
を書くことで、:article_id
を渡せる
= form_with(model: @comment,
url: article_comments_path(@comment.article), local: true) do |f|
↓(上部)エラーの表示についてのコード、(下部)フォームの追加をする
.container
%ul
- @comment.errors.full_messages.each do |message|
%li= message
= form_with(model: @comment, url: article_comments_path(@comment.article), local: true) do |f|
%div
= f. label :content, '内容'
%div
= f.text_area :content
= f.submit '保存', class: 'btn-primary'
app/views/articles/show.html.hamlを開いて以下を追加する
.container
= link_to new_article_comment_path(@article) do
.btn-secondary
コメントを追加
createアクション
app/controllers/comments.controller.rbを開いて、以下を追加する
def create
@article = Article.find(params[:article_id])
@comment = @article.comments.build(comment_params)
if @comment.save
redirect_to article_path(@article), notice: 'コメントを追加'
else
flash.now[:error] = '更新できませんでした'
render :new
end
end
@article = Article.find(params[:article_id])
→ POSTリクエストでarticle_idを取得できるので、該当の記事を探してこれる@comment = @article.comments.build(comment_params)
→ パラメーター(comment_params)を@commentに渡すredirect_to article_path(@article), notice: 'コメントを追加'
→ 保存できたら記事詳細ページに戻り、「コメントを追加」のメッセージを表示するflash.now[:error] = '更新できませんでした'
→ 保存できなかったら、「更新できませんでした」のメッセージを表示するrender :new
→ newのviewに戻る
コメントのうち、:contentのみを保存する
private
def comment_params
params.require(:comment).permit(:content)
end
他者がコードをいじってなんでも保存すると困るため、セキュリティ強化しておく
app/models/comment.rbを開く
「:content
が未入力はだめだよ」とvalidationを書く
class Comment < ApplicationRecord
belongs_to :article
validates :content, presence: true
end
コメント一覧を表示
app/controllers/articles.controller.rbを開く
記事詳細ページを表示するため、@article
は最初に取得できている
(showアクションのみ)
before_action :set_article, only: %i[show]
# 中略
private
def set_article
@article = Article.find(params[:id])
end
ここにコメントを追加するので、showアクションに以下を追加する
これだけで@article
に紐づくコメントを取得できる
def show
@comments = @article.comments
end
.article
%h2 コメント一覧
- @comments.each do |comment|
.article_comment
%p= comment.content
railsでは、controllerで定義を書いて、viewでは表示させるだけにする
#DAY22