質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

Q&A

解決済

1回答

1003閲覧

【Rails】kaminari gemを使ってページネーションを実装したい

yastinbieber

総合スコア49

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

0グッド

0クリップ

投稿2020/04/03 12:05

現在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 画面です。

コントローラー内だけをいじれば良いのか。またモデルをいじるべきなのか。
理解が追いついていない状況でして、お手数おかけしますがどなたかやり方についてご教示いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yastinbieber

2020/04/07 11:27

ご返信ありがとうございます。 githubも確認し、ほか手探り状態ではありますがググった形です。 product_indexページにおける <% @products.each do |product| %> 〜 <% end %> <%= paginate(@products) %> はうまく反映されているのですが、 product_showページにおける <% @product.reviews.each do |review| %> 〜 <% end %> の箇所がうまくいかない形です。 モデルをいじるべきなのか含め理解が追いついていない状況でして、 わかりましたらご教示いただけますと幸いです。
guest

回答1

0

自己解決

ruby

1class ProductsController < ApplicationController 2 before_action :authenticate_user! 3 4 def show 5 @product = Product.find(params[:id]) 6 @review = @product.reviews.all.count 7 @products = @product.reviews.page(params[:page]).per(3) 8 end 9 10end

上記新たに**@product**を作成することにより解決しました。

ご協力いただきありがとうございました!

投稿2020/04/07 11:47

yastinbieber

総合スコア49

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問