現在Railsにて読書アプリを作成しております。
そこで書籍(product)に紐づいた感想達(review)にページネーションをしたいのですがやり方がわからず困っています。
(product#show の下半分にその書籍に対するレビューがつらつらと並んでいます。そのレビューらを1ページ5件程度にしページネーションを実装したいと考えております)
スクショと該当する箇所を下記に貼らせていただきますのでどなたかご教示いただけますと幸いです。
Rails
1##products_controller 2class ProductsController < ApplicationController 3 before_action :authenticate_user! 4 5 def index 6 @products = Product.order("created_at ASC").page(params[:page]).per(5) 7 end 8 9 def new 10 @product = Product.new 11 end 12 13 def create 14 @products = Product.create(bookname: product_params[:bookname], author: product_params[:author], image: product_params[:image], user_id: current_user.id) 15 end 16 17 def show 18 @product = Product.find(params[:id]) 19 @review = @product.reviews.all.count 20 @reviews = Review.order("created_at ASC").page(params[:page]).per(5) 21 end 22 23 def search 24 @products = Product.where('bookname LIKE(?)', "%#{params[:keyword]}%").limit(10) 25 end 26 27 private 28 def product_params 29 params.require(:product).permit(:bookname, :author, :image) 30 end 31 32end
rails
1 2##products_show.html.erb 3--省略-- 4 <div class="container-left-register"> 5 <h3>書籍に対するレビュー一覧</h3> 6 </div> 7 <% @product.reviews.each do |review| %> 8 <div class="review-detail"> 9 <div class="review-detail-item"> 10 <div class="username"> 11 <a class="user-page" href="/users/<%= review.user_id %>">@<%= review.user.nickname %></a> 12 <p class="text-small"> 13 <% if review.comments.present? %> 14 <span>レビューに対しての平均評価:</span> 15 <span class="rating-star"> 16 <i class="star-actived rate-<%= review.comments.average(:rate).round %>0"></i> 17 </span> 18 <% else %> 19 <span>レビューに対しての平均評価:</span> 20 <span class="rating-star"> 21 <i class="star-actived rate-0"></i> 22 </span> 23 <% end %> 24 </p> 25 </div> 26 <div class="write-review"> 27 <h3><span class="product-btn">title:<%= @product.bookname %></span></h3> 28 </div> 29 <div class="review-1"> 30 <br><p><%= truncate(review.review, length: 10) do %></p> 31 <% end %> 32 </div> 33 </div> 34 <%= link_to 'レビュー詳細', "/products/#{@product.id}/reviews/#{review.id}", method: :get, class: "right-btn-review-detail" %> 35 </div> 36 <% end %> 37 <%= paginate(@reviews) %> 38 </div>
真ん中あたりにある<% @product.reviews.each do |review| %>から<% end %>の箇所をページネーションしたいと考えております。
一応<%= paginate(@reviews) %>で今は置いてます(現状だと他のプロダクトに対するレビューも全て加味されてしまっている)
Rails
1##product.rb 2class Product < ApplicationRecord 3 4 has_one_attached :image 5 6 has_many :reviews 7 belongs_to :user 8 has_many :comments 9end 10
画像上の真ん中から下の「書籍に対するレビュー一覧」という部分がプロダクトにおけるレビュー達になっております。
ちなみにこの画面はproducts#show 画面です。
コントローラー内だけをいじれば良いのか。またモデルをいじるべきなのか。
理解が追いついていない状況でして、お手数おかけしますがどなたかやり方についてご教示いただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー