🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails 6

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

Q&A

解決済

1回答

2031閲覧

Kaminariとeach.with_indexを組み合わせて連番表示させる方法について

Angelica.87

総合スコア9

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/03/07 22:17

前提・実現したいこと

モデルに入っている要素の数だけ番号を振っていく仕組みを構築しているのですがeach.with_index(1)までは辿り着いたのですが、Kaminariを実装していて2ページ目に移動した時に連番表示されていないので、これを連番表示する方法をご教授いただきたい。

発生している問題・エラーメッセージ

イメージ説明
イメージ説明

1ページ目は1から10まで番号が振られている。 2ページ目は10から20まで番号が振られている状態にしたいが1ページ目と同じ状態になってしまっている。

該当のソースコード

ruby

1#index.html.erb 2<h1 class="display-4 text-primary">Note#index</h1> 3<p><%= @msg %></p> 4<p>商品<%= @msg2 %>点、おおよその合計金額は<%= @msg3 %>です。</p> 5<p><a href="/hello/login_check/">Home</a>&gt;Note#index</p> 6<table class="table"> 7 <tr> 8 <th>Id</th><th >product</th><th>number</th><th>price</th><th colspan="2"></th> 9 </tr> 10 <% @data.each.with_index(1) do |obj,id| %> 11 <tr> 12 <td><%= id %></td> 13 <td><%= obj.product %></td> 14 <td><%= obj.number %></td> 15 <td><%= obj.price %>円</td> 16 <td>add</td> 17 <td><a href="javascript:delData(<%= obj.id %>);">Delete</a></td> 18 </tr> 19 <% end %> 20</table> 21 22<br> 23<div><%= paginate @data %></div> 24<br> 25 26<p><a href="/hello/category/">Shopping#categoryで商品を追加する</a></p> 27<p><a href="/hello/login_check/">&lt;&lt Shopping#homeに戻る</a></p> 28<p><a href="">&lt;&lt; Noteを削除してShopping#homeに戻る</a></p> 29 30 31 32<script> 33function delData(num){ 34 if (confirm('このデータを削除しますか?')){ 35 document.location = "/notes/delete/" + num; 36 } 37 return false; 38} 39</script> 40

試したこと

ネットで検索したが解決方法が分かりませんでした。ご教授いただきたいです。

補足情報(FW/ツールのバージョンなど)

windows10

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

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

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

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

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

guest

回答1

0

ベストアンサー

表示されているページが page に、1ページあたりのデータ数が par_page に入っているという前提で。
start = (page - 1) * par_page each.with_index(start)

投稿2021/03/07 22:57

winterboum

総合スコア23567

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

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

Angelica.87

2021/03/08 19:41

おはようございます。 ご教授いただいている内容は#index.html.erbのどの部分にどのような形で入れるのでしょうか?
winterboum

2021/03/08 22:39

controllerで @start = (page - 1) * par_page して index.htmlのeach.with_index(1) を each.with_index(@start)
Angelica.87

2021/03/09 09:09

NoMethodError in NotesController#index undefined method `page' for #<NotesController:0x000000000bf6b7c8> Extracted source (around line #6): 4 5 6 7 8 9 @msg = Note.count @msg2 = Note.sum{|hash|hash[:price]} @start = (page -1) * par_page end def delete Rails.root: C:/Users/****/Desktop/RailsApp Application Trace | Framework Trace | Full Trace app/controllers/notes_controller.rb:6:in `index' Request Parameters: None Toggle session dump Toggle env dump Response Headers: None すみません。このようなエラーメッセージが出てしまいました。
winterboum

2021/03/09 10:00

controller のcode載せて
Angelica.87

2021/03/09 10:43

class NotesController < ApplicationController def index @data = Note.page params[:page] @msg = Note.count @msg2 = Note.sum{|hash|hash[:price]} @start = (page - 1) * par_page end def delete obj = Note.find(params[:id]) obj.destroy redirect_to '/notes' end def all_delete obj = Note.all obj.delete_all redirect_to '/hello/login_check/' end end これになります。
winterboum

2021/03/09 13:35

@data = Note.page params[:page] だから page = (params[:page] || 1).to_i ページあたりデータ数は無指定だから10なので par_page = 10 を入れて
Angelica.87

2021/03/09 20:18

おはようございます。 以下のようにコントローラーを修正したのですがエラーが出てしまいました。 class NotesController < ApplicationController def index @data = Note.page params[:page] @msg = Note.count @msg2 = Note.sum{|hash|hash[:price]} par_page = 10 @start = (page - 1) * par_page end def delete obj = Note.find(params[:id]) obj.destroy redirect_to '/notes' end def all_delete obj = Note.all obj.delete_all redirect_to '/hello/login_check/' end end エラー内容 NameError in NotesController#index undefined local variable or method `page' for #<NotesController:0x000000000c32a990> Extracted source (around line #7): 5 6 7 8 9 10 @msg2 = Note.sum{|hash|hash[:price]} par_page = 10 @start = (page - 1) * par_page end def delete Rails.root: C:/Users/****/Desktop/RailsApp Application Trace | Framework Trace | Full Trace app/controllers/notes_controller.rb:7:in `index' Request Parameters: None Toggle session dump Toggle env dump Response Headers: None コントローラーの修正が必要であればどの部分をどのように修正すればよいのかご教授いただけるとありがたいです。
winterboum

2021/03/09 22:43

@start = ((params[:page] || 1 ).to_i - 1) * par_page
Angelica.87

2021/03/10 22:18

class NotesController < ApplicationController def index @data = Note.page params[:page] @msg = Note.count @msg2 = Note.sum{|hash|hash[:price]} @start = ((params[:page] || 1 ).to_i - 1) * par_page end def delete obj = Note.find(params[:id]) obj.destroy redirect_to '/notes' end def all_delete obj = Note.all obj.delete_all redirect_to '/hello/login_check/' end end すみません。この形でやったら以下のエラーが出てしまいした。 NameError in NotesController#index undefined local variable or method `par_page' for #<NotesController:0x000000000e6b4488> Extracted source (around line #6): 4 5 6 7 8 9 @msg = Note.count @msg2 = Note.sum{|hash|hash[:price]} @start = ((params[:page] || 1 ).to_i - 1) * par_page end def delete Rails.root: C:/Users/****/Desktop/RailsApp Application Trace | Framework Trace | Full Trace app/controllers/notes_controller.rb:6:in `index' Request Parameters: None Toggle session dump Toggle env dump Response Headers: None index.html.erbは以下の通りです。 <h1 class="display-4 text-primary">Note#index</h1> <p>商品<%= @msg %>点、おおよその合計金額は<%= converting_to_jpy(@msg2) %>です。</p> <p><a href="/hello/login_check/">Home</a>&gt;Note#index</p> <table class="table"> <tr> <th>Id</th><th >product</th><th>number</th><th>price</th><th colspan="2"></th> </tr> <% @data.each.with_index(@start) do |obj,id| %> <tr> <td><%= id %></td> <td><%= obj.product %></td> <td><%= obj.number %></td> <td><%= obj.price %>円</td> <td><%= check_box_tag "notelist","product" %></td> <td><a href="javascript:delData(<%= obj.id %>);">Delete</a></td> </tr> <% end %> </table> <br> <div><%= paginate @data %></div> <br> <p><a href="/hello/category/">※Shopping#categoryで商品を追加する</a></p> <p><a href="/hello/login_check/">※&lt;&lt Shopping#homeに戻る</a></p> <p><a href="javascript:delData2(<% @data %>);">※&lt;&lt;商品を全て削除してShopping#homeに戻る</a></p> <script> function delData(num){ if (confirm('この商品を削除しますか?')){ document.location = "/notes/delete/" + num; } return false; } function delData2(num){ if (confirm('全ての商品を削除しますか?')){ document.location = "/notes/all_delete/"; } return false; } </script>
winterboum

2021/03/10 22:36

par_page = 10 消しちゃだめ
Angelica.87

2021/03/11 10:06

ご指導ありがとうございます。 指導いただいた内容で連番表示にすることが出来たのですが、0から数字が始まってしまうので これを1から始めるにはどのようなコードを書けばよいのか、ご教授いただきたいです。
winterboum

2021/03/11 10:52

あ、 最後に +1 するの忘れてました
Angelica.87

2021/03/11 11:02

どこにプラス1すれば良いでしょうか?
winterboum

2021/03/11 11:03

@start = (page - 1) * par_page
Angelica.87

2021/03/11 11:12

winterbounさん忙しい中、長期間の対応ありがとうございました。 おかげ様で希望する形に出来ました。
winterboum

2021/03/11 11:35

できてよかったですが、、、、 このくらいの問題なら start = (page - 1) * par_page each.with_index(start) このヒントでできて欲しかった。 コメントでのやりとりの質問のレベル低すぎ、とくに 「どこにプラス1すれば良いでしょうか?」はひどい。 このレベルを人に頼るようでは独り立ちできないですよ
Angelica.87

2021/03/11 20:04

お言葉ありがとうございます。 少しでもレベルをあげられるように、コツコツ頑張りたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問