コメント投稿機能を実装しよう

学習の目標

本章では、以下の内容を学習します。

  • CommentsController の create アクションを実装する方法を理解する
  • フォームから送信されたパラメータの取り扱い方を習得する
  • コメント保存後のリダイレクト処理フラッシュメッセージの設定方法を学ぶ
  • エラーハンドリングの基本的な実装方法を理解する

はじめに

前回のレッスンでは、投稿詳細ページにコメントフォームを追加しました。見た目は整いましたが、まだ実際にコメントを投稿する機能は実装していません。そのため、「コメントする」ボタンをクリックしてもエラーになってしまいます。

今回は、コメントフォームから送信されたデータを処理し、データベースに保存する機能を実装します。この機能により、ユーザーが実際に投稿に対してコメントを残せるようになり、TechLog アプリケーションがより対話的なプラットフォームへと進化します。

コメント投稿機能の実装では、前回作成した CommentsController の create アクションを中心に作業を進めていきます。このアクションでは、フォームから送信されたデータを受け取り、新しいコメントをデータベースに保存します。また、処理が成功した場合と失敗した場合のハンドリングも実装します。

それでは、具体的なコードと共に実装を進めていきましょう。

CommentsController の実装

前回のレッスンで作成した CommentsController に、create アクションを実装していきます。app/controllers/comments_controller.rb を開き、create アクションを以下のように実装してください。

def create
@comment = @post.comments.build(comment_params)
@comment.user = current_user
if @comment.save
flash[:notice] = 'コメントを投稿しました'
redirect_to post_path(@post)
else
flash[:alert] = 'コメントの投稿に失敗しました'
redirect_to post_path(@post)
end
end

この create アクションでは、いくつかの重要な処理を行っています。順番に見ていきましょう。

コメントの作成と関連付け

@comment = @post.comments.build(comment_params)
@comment.user = current_user

まず、@post.comments.build(comment_params) により、現在表示している投稿(@post)に紐づく新しいコメントを作成しています。build メソッドは new メソッドと似ていますが、親オブジェクト(この場合は @post)との関連付けも同時に行います。そのため、新しいコメントの post_id には自動的に現在の投稿のIDが設定されます。

また、comment_params はストロングパラメータと呼ばれるメソッドで、フォームから送信されたデータのうち、許可されたパラメータ(この場合は content)のみを取り出します。これにより、セキュリティリスクを軽減しています。

次に、@comment.user = current_user により、コメントの投稿者を現在ログインしているユーザーに設定しています。current_user は Devise が提供するヘルパーメソッドで、現在ログインしているユーザーのオブジェクトを返します。

これらの処理により、「誰が」「どの投稿に」コメントしたのかという情報が正しく設定されます。

保存処理とフラッシュメッセージ

if @comment.save
flash[:notice] = 'コメントを投稿しました'
redirect_to post_path(@post)
else
flash[:alert] = 'コメントの投稿に失敗しました'
redirect_to post_path(@post)
end

コメントの保存は @comment.save メソッドで行います。このメソッドは保存が成功すると true を、失敗すると false を返します。そのため、if 文を使って成功と失敗の場合で処理を分けることができます。

成功した場合は、flash[:notice] に成功メッセージを設定し、投稿詳細ページにリダイレクトします。失敗した場合は、flash[:alert] にエラーメッセージを設定し、同じく投稿詳細ページにリダイレクトします。

フラッシュメッセージは、一度だけ表示される一時的なメッセージで、ユーザーアクションの結果をフィードバックするために使用されます。TechLog アプリケーションでは、既に他の機能(投稿やログインなど)でもフラッシュメッセージを使用しているので、同じパターンに従っています。

なお、失敗時のエラー処理については、今回は簡単のためにエラーメッセージを表示するだけにしていますが、実際のアプリケーションでは、エラーの詳細を表示したり、入力された内容を保持したりするなど、より親切な処理を行うことが一般的です。

動作確認

CommentsController の実装が完了したら、実際にコメント投稿機能が動作するか確認してみましょう。

$ bin/dev

ブラウザで投稿詳細ページにアクセスし、コメントフォームに何か入力して「コメントする」ボタンをクリックしてください。すると、以下のような流れになるはずです。

  1. コメントが投稿される
  2. 「コメントを投稿しました」というフラッシュメッセージが表示される
  3. 投稿詳細ページにリダイレクトされる

コメント投稿の動作確認

ただし、まだコメント一覧を表示する機能を実装していないため、投稿したコメントは表示されません。次のレッスンで、コメント一覧表示機能を実装していきます。

トラブルシューティング

もし「コメントする」ボタンをクリックしてもエラーが表示される場合は、以下の点を確認してみてください。

  1. CommentsController の create アクションが正しく実装されているか
  2. コメントフォームのURL設定(post_comments_path(@post))が正しいか
  3. ルーティングが正しく設定されているか(rails routes | grep comment で確認できます)

特に、ネストされたリソースのルーティングは少し複雑なので、エラーが発生した場合はまずルーティングを確認するのが良いでしょう。

変更をコミット

ここまでの変更をコミットしておきましょう。コードの変更点をまとめて管理することで、開発の進捗を把握しやすくなります。

$ git add .
$ git commit -m "コメント投稿機能を実装"
$ git push

まとめ

本章では、コメント投稿機能を実装しました。CommentsController の create アクションを実装することで、ユーザーが投稿に対してコメントを残せるようになりました。

具体的には、以下の内容を実装しました。

  • CommentsController の create アクションの実装
  • フォームから送信されたパラメータを使ったコメントオブジェクトの作成
  • コメントの保存処理と成功/失敗時のフラッシュメッセージ設定
  • 処理後のリダイレクト設定

この実装により、ユーザーは投稿に対してコメントを投稿できるようになりました。

しかし、まだコメントを表示する機能は実装していないため、投稿したコメントを確認することはできません。次のレッスンでは、投稿詳細ページにコメント一覧を表示する機能を実装し、ユーザー間のコミュニケーションをより活性化させていきます。

このセクションは有料サブスクリプションへの登録、またはログインが必要です。完全なコンテンツにアクセスするには、料金ページ(/pricing)をご覧ください。購入済みの場合は、ログインしてください。

Basicプランでより詳しく学習

この先のコンテンツを読むにはBasicプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。

作成者:とまだ
Previous
投稿詳細ページにコメントフォームを追加しよう