#はじめに
Rubu on Railsでオリジナルアプリを作成しています。そのアプリにコメント機能を実装しました。そのため忘れないように書き記します。
#手順
・commentモデル、テーブルの作成
・commentsコントローラーとルーティングの設定
・各コントローラーのアクション設定
#commentモデル、テーブルの作成
はじめに下記のようにターミナルでcommentモデルを作成します。
rails g model comment
その後マイグレーションファイルに、textカラムを追加します(このtextカラムにはコメントが保存されます)。
class CreateComments < ActiveRecord::Migration[6.0]
def change
create_table :comments do |t|
t.text :text, null: false
t.references :user, foreign_key: true
t.references :desk, foreign_key: true
t.timestamps
end
end
end
userとdeskを外部キー設定します。このコメントは誰が、どのdesk(画像)にしたものか管理するためです。同様にcommentモデルにもバリデーションの他、アソシエーションを設定する必要があります。
validates :text, presence: true
belongs_to :user
belongs_to :desk
userモデル、deskモデルにもアソシエーションを追加します。なお、今回のバリデーションはコメントが空だと保存できないような設定です。
#commentsコントローラーとルーティングの設定
ターミナルでコメントのコントローラーを作成します。この時、コントローラー名は複数形にする(いつもどっちだっけ?って悩んでます😅)。
rails g controller comments
お次は作成したcommentsコントローラーにcreateアクションを設定します。このとき、中身は空で一旦OKです。
def create
end
最後にルーティングを。コメントはdesk(画像)と紐付けします。なのでネスト(入れ子構造)にします。
resources :desks do
resources :comments, only: :create
end
くどくなりますが、どの画像に対するコメントなのかをパスから判断できるようにすることが重要です。
#各コントローラーのアクション設定
今回はdesks(画像)コントローラーのshowアクションに対するレスポンスページでコメント保存、表示します(元々このページは、投稿された画像の詳細ページです)。なので、まずはdeskコントローラーのshowアクションに@commentのインスタンス変数を定義します。
def show
@desk = Desk.find(params[:id])
@comment = Comment.new
@comments = @desk.comments
end
なお画像に付けられたコメントを一覧で表示するため。@commentsでコメントを取得しています。
今度はcommentsコントローラーへの設定です。こちらではストロングパラメータを設定します。requireにモデル名、permitに保存カラムを設定します。アソシエーション関係にあるものはmergeに記述します。なおdevise Gemがインストールされているので、current_userメソッドを使用しています。これによりコメントが誰が(user_id)、何に(desk_id)にされたものか管理できます。
def create
@comment = Comment.new(comment_params)
if @comment.save
redirect_to desk_path(@comment.desk)
else
@desk = @comment.desk
@comments = @desk.comments
render "desks/show"
end
end
private
def comment_params
params.require(:comment).permit(:text).merge(user_id: current_user.id, desk_id: params[:desk_id])
end
以上