アソシーションの実装
やりたい事
・レビュー保存時に『誰が書いたレビュー』なのかという情報を保存する
・レビューの表示時にレビューを書いた人のnicknameを表示できるよう実装
・レビューの投稿画面の方のニックネームの入力欄は消す
作業内容
1.ニックネームの入力欄を消す
2.userモデルとreviewモデルの間にアソシエーションを設定する
1.ニックネームの入力欄を消す
・レビューを投稿するユーザーのニックネームはサインアップの段階ですでに設定済みなので、このテキストフィールドは消す
作業ファイル:app/views/reviews/new.html.erb
消去するコード
<div style="margin: 8px 0">
<%= f.label :nickname, style: { 'margin-right' => 8 } %>
<%= f.text_field :nickname, placeholder: 'nickname', value: '' %>
</div>
続いて、サインイン中のユーザーを取得してそのユーザーのnicknameをレビューに含めるようにする
やりたい事
・reviewを新規投稿する際、投稿者のnicknameをreviewsテーブルへ保存する
作業ファイル:app/controllers/reviews_controller.rb
# 変更前
private
def create_params
params.require(:review).permit(:nickname, :rate, :review).merge(product_id: params[:product_id])
# 変更後
private
def create_params
params.require(:review).permit(:rate, :review).merge(product_id: params[:product_id], nickname: current_user.nickname)
・createメソッドを使用する事で、テーブルにカラムを保存できる
・createメソッドの引数は、(保存したいカラム:保存する値,保存したいカラム:保存する値)
・ストロングパラメーターにnicknameカラムの指定はする必要がなくなったので、permitメソッドの引数から削除する
2.userモデルとreviewモデルの間にアソシエーションを設定する
やりたい事
・ReviewモデルとUserモデルの間にアソシエーションを設定
・nicknameの情報はアソシエーションで取得できるUserモデルのインスタンスが、カラムとして持っているため削除する
・レビューを書いたユーザーのニックネームを取得できるようにする
・Reviewsテーブルにuser_idのカラムを追加する
reviewsテーブルのnicknameカラムを削除する
$ rails g migration RemoveNicknameFromReviews nickname:string
マイグレーションの実行
$ rake db:migrate
reviewsテーブルにuser_idカラムを追加
$ rails g migration AddUserIdToReviews user_id:integer
マイグレーションの実行
$ rake db:migrate
モデル間にアソシエーションを設定する
user⇨review
has_many :reviews
# userは複数reviewを持つ
review⇨user
belongs_to :user
# reviewは1つのuserに所属する
reviewを保存する際に投稿したユーザーのid番号を記録するよう実装
・current_userのidカラムの値を、reviewのuser_idカラムに保存
作業ファイル:reviews_controller
private
def create_params
params.require(:review).permit(:rate, :review).merge(product_id: params[:product_id], user_id: current_user.id)
end
ビューへ反映させる
・reviewのnicknameカラムから取得していた名前の情報を、reviewとuserのアソシエーションを利用して取得する
作業ファイル:show.html.erb
<h3 class="text-xsmall text-overflow" title="<%= review.user.nickname %>">
<span><i class="icon-rate-60 text-xxsmall opacity-60" title=""></i></span><%= review.user.nickname %>
</h3>
以上