mac OS バージョン11.6
エディタ…VScode
Rails 6.0.4
映画のレビュー機能に関する備忘録です。
レビューを一覧表示させることが目的で、レビューの投稿に関する記述は端折っています。
必要であれば別の記事で追記します。
1.モデル設計
・Userは多くのReviewを持ち、Movieも多くのReviewを持つことになる多対多の関係。
・中間テーブルを作成して1つのレコード毎に、レビューの所有者(user_id)・映画(movie_id)・レビューの内容を格納するreview_textカラムを追加する。
movie.rb
class Movie < ApplicationRecord
has_many :reviews # Movie.commentsで、投稿が所有するコメントを取得できる
end
user.rb
class User < ApplicationRecord
has_many :reviews #User.reviewsで、ユーザーの所有するコメントを取得できる
end
review.rb
class Review < ApplicationRecord
.
.
.
belongs_to :user # Review.userでコメントの所有者を取得
belongs_to :movie # Review.movieでそのコメントがされた投稿を取得
end
2.コントローラー設計
movies_controller.rb
def show
.
.
@reviews = @movie.reviews # レビューを一覧表示
end
reviews_controller.rb
class ReviewsController < ApplicationController
before_action :require_user_signed_in, only: [:create]
def create
@review = current_user.reviews.new(review_params)
@review.save
redirect_to movie_path(@review.movie_id)
end
def new
@review = Review.new
end
private
def review_params
params.require(:review).permit(:movie_id, :user_id, :text, :raty)
end
end
3.viewを編集
movies/show.html.erb
.
.
.
<h1>レビュー一覧</h1>
<% @reviews.each do |review|%>
<div class=card>
<%= review.user.name %><br>
<p>評価 :<%= review.raty %>点</p>
<div id="star-rate<%= review.id %>"></div>
<script>
$('#star-rate<%= review.id%>').raty({
size : 36,
starOff : '<%= asset_path('star-off.png') %>',
starOn : '<%= asset_path('star-on.png') %>',
starHalf: '<%= asset_path('star-half.png') %>',
readOnly: true, //星を読み取り専用にする
score: <%= review.raty %>,
});
</script>
<p>内容:<%= review.text%></p>
</div>
<% end %>