0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

7/15 今日学んだ事(アソシーションの実装)

Last updated at Posted at 2019-07-15

アソシーションの実装

やりたい事

・レビュー保存時に『誰が書いたレビュー』なのかという情報を保存する
・レビューの表示時にレビューを書いた人のnicknameを表示できるよう実装
・レビューの投稿画面の方のニックネームの入力欄は消す

作業内容

1.ニックネームの入力欄を消す
2.userモデルとreviewモデルの間にアソシエーションを設定する

1.ニックネームの入力欄を消す

・レビューを投稿するユーザーのニックネームはサインアップの段階ですでに設定済みなので、このテキストフィールドは消す

作業ファイル:app/views/reviews/new.html.erb

消去するコード

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

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

user.rb
has_many :reviews
# userは複数reviewを持つ

review⇨user

review.rb
belongs_to :user
# reviewは1つのuserに所属する

reviewを保存する際に投稿したユーザーのid番号を記録するよう実装

・current_userのidカラムの値を、reviewのuser_idカラムに保存

作業ファイル:reviews_controller

reviews_controller.rb
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

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>

以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?