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

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

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

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Ruby on Rails

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

Q&A

解決済

1回答

1569閲覧

kaminariを使ってpagenationを表示させるやり方

hiratashinichi

総合スコア1

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Ruby on Rails

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

0グッド

0クリップ

投稿2021/06/16 08:21

現在gem kaminariをインストールしてページにページネーションを表示したくて
rails g Controller usersを実行して
def index
@users = User.page(params{page:})
と指定しているのですが以下のようなエラーが出て困っています。

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

エラーメッセージ ```NameError in UsersController#index uninitialized constant UsersController::User Extracted source (around line #3): class UsersController < ApplicationController def index @users = User.page(params[:page]) end end ### 該当のソースコード ```ここに言語名を入力 ソースコード ```rails g controller users ### 試したこと users_controller.rbの中の @users = User.page(params[:page])      を@users = User.allに変えてみたり      app/views/users/index.html.erbの中を      以下に書き換えたりして実行しても同じエラーでした。    <div class="page-header"> <h1>単語一覧</h1> </div> <div class="list-group"> <% @users.each do |user| %> <%= link_to(word, class: 'list-group-users') do %> <h4 class="list-group-item-heading"> <%= word.word %> </h4> <p class="list-group-item-text"> <%= user.reading %> </p> <% end %> <% end %> <%= paginate @users %> </div> Nameerrorを翻訳すると定義されていない変数と書いてあったのですが変数に関わる何か必要な 処理があるのでしょうか? 初心者なものですいませんどなたか分かる方がいましたら回答よろしくお願いします。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

hatsu

2021/06/16 08:31

ちなみにUserモデルって存在ますか? app/models/user.rbファイルがあって ``` class User < ApplicationRecord end ``` みたいにかかれているようなファイルが必要だと思っています。
hiratashinichi

2021/06/16 08:49

回答ありがとうございます! 今rails g model userを実行してmigrateをかけるとviewのページが表示されました。 しかしページネーションの1,2,nextとテンプレートが見当たらないのですがこちらの方は modelのuser.rbに何か処理を施さなければいけないのでしょうか?
hatsu

2021/06/16 08:51

Userのデータ数がページを分けるほどの量がないだけだと思います。 たとえばUserが一人の場合に2ページ目などは必要ないので。
hiratashinichi

2021/06/16 09:05

つまりusers.controller.rbのpagination自体はすでにviewsに反映されているってことでしょうか?
guest

回答1

0

ベストアンサー

NameError in UsersController#index uninitialized constant UsersController::User Extracted source (around line #3):

このエラーメッセージからUsersController#indexにある、3行目Userクラスが定義されていないと思われます。

rails g model UserでModel作成などをするとこのエラーは消えるかと思います。

あとは、Viewに <%= paginate @users %> を書かれているならばページネーションの実装はできていると思われます。
確認の仕方として。
たとえば、

  1. rails consoleを立ち上げて
  2. User.create(name: "hoge") #nameカラムがあるかはわからないのでよしなに。Userをいくつか作成し、
  3. Controllerで1件づつ表示とかにすると確認しやすいかもしれないです。
def index @users = User.page(params[:page]).per(1) end

投稿2021/06/16 09:14

hatsu

総合スコア1809

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

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

hiratashinichi

2021/06/16 09:41

たびたび申し訳ないです! rails cをして上記User.create(name: "hoge")を実行するとattributeerrorになってしまったんですが こちらはdb/migrate/user.createのファイル内以下 class CreateUsers < ActiveRecord::Migration[6.1] def change create_table :users do |t| t.timestamps end end end にt.nameとカラムを作成してmigrateを実行すればよろしいのでしょうか?
hatsu

2021/06/16 09:44

> t.nameとカラムを作成してmigrateを実行すればよろしいのでしょうか? はい、そのようなイメージです。 より具体的には、t.nameではなく、t.string :name, null: false, default: "" みたいになると思います。 すでにMigrateをした場合にこのファイルの変更を反映させる際は、rails db:migrate:resetで反映できます。rials db:migrateだと反映されません。
hiratashinichi

2021/06/16 10:08

すいませんmigrateのuser createにt.string :name, null: false, default: ""とカラムを持たせmigrateを 実行後 rails cで再度User.create(name: "hoge")を入力してexitでコンソールから抜けた後に rails sで確認してみましたけど反映されていませんでした。 本当にご丁寧にいろいろなご教授して下さってありがとうございました。
hatsu

2021/06/16 10:18

すいません、「反映されていない」というのはどういう状態でしょうか? Viewに書いたHTMLが見れない?それとも <%= paginate @users %> の部分だけ表示されていないのでしょうか?
hiratashinichi

2021/06/16 10:43

言葉が変になって申し訳けございません。 反映というのはapp/views/user/index.html.erbの中の下記 <h1>投稿一覧</h1> <ul> <% @users.each do |user| %> <li><%= user.content %></li> <% end %> </ul> <%= paginate @users %> ブラウザでは投稿一覧の文字しか表示されずに本来なら文字の上にページネーションのテンプレート 1,2,nextが表示されていなかったということの反映でございます。
hatsu

2021/06/16 11:08

なるほどです。@usersが空配列の可能性がありそうに思いました。 users_controller.rbの中身ってどうなっていますでしょうか? ``` def index @users = User.page(params[:page]).per(1) end ``` って書かれているのに表示されないならば、Userのレコード(データ)がそもそも存在していないかもです。 User.createがうまくできてなく、Userのレコードが存在していないとか? あとはページにアクセスしたときのログも貼っていただけるとより正確に状況が掴めそうです。
hiratashinichi

2021/06/16 12:06

すいません アクセスログというのは実際にhttp://127.0.0.1:3000/users/indexにアクセスした際のどこか に表示されているのでしょうか? 他にも調べたらFinder/application/consoleというものがあるのですがどういったものですかね? 何度も聞いてすいません。
hatsu

2021/06/16 12:09

あ、ログはrails sをやっているターミナルに表示される文字列のことを指していました。 http://127.0.0.1:3000/users/indexにアクセスすると、rails sしているターミナルに色々表示されると思います。それがログで、解決のヒントがあるかなと思っています。
hiratashinichi

2021/06/16 12:18

なるほど、ありがとうございます。でしたらrails sしてターミナルを見ると下記のような 表示がでていました。 Rendering layout layouts/application.html.erb Rendering users/index.html.erb within layouts/application (0.1ms) SELECT sqlite_version(*) ↳ app/views/users/index.html.erb:4 User Load (0.7ms) SELECT "users".* FROM "users" LIMIT ? OFFSET ? [["LIMIT", 2], ["OFFSET", 0]] ↳ app/views/users/index.html.erb:4 Rendered users/index.html.erb within layouts/application (Duration: 11.8ms | Allocations: 2490) [Webpacker] Everything's up-to-date. Nothing to do Rendered layout layouts/application.html.erb (Duration: 31.9ms | Allocations: 6038) Completed 200 OK in 38ms (Views: 33.4ms | ActiveRecord: 1.1ms | Allocations: 6969)
hatsu

2021/06/16 12:23

ありがとうございます。index.html.erbの4行目で@usersを取得するSQLが走っていそうですね。 それで表示されないならば、そもそもUserのレコードが1つもない可能性がやはり高そうに思います。 Rails ConsoleでUser.allとしたときの結果や、User.create(name: "hoge")とかでUserのデータって作成ができているかを確認したいです。
hiratashinichi

2021/06/16 12:42

rails cを実行した時にレコードを追加した際のターミナルにあるログでよろしいでしょうか? それでしたら先ほどmigrateした後にrails cして、User.create(name: "hoge")を入力した結果がこちらに なります。(意味が違っていたら申し訳ございません。) hiratashinichi@122-222-236-207 product % rails c Running via Spring preloader in process 18077 Loading development environment (Rails 6.1.3.2) irb(main):001:0> User.create(name: "hoge") (1.9ms) SELECT sqlite_version(*) TRANSACTION (0.1ms) begin transaction User Create (0.8ms) INSERT INTO "users" ("name", "created_at", "updated_at") VALUES (?, ?, ?) [["name", "hoge"], ["created_at", "2021-06-16 09:53:44.372820"], ["updated_at", "2021-06-16 09:53:44.372820"]] TRANSACTION (1.8ms) commit transaction => #<User id: 1, name: "hoge", created_at: "2021-06-16 09:53:44.372820000 +0000", updated_at: "2021-06-16 09:53:44.372820000 +0000"> irb(main):002:0> exit
hatsu

2021/06/16 12:46

ありがとうございます。Userデータは作成されていますね。それならば <% @users.each do |user| %> <%= user.name %> <% end %> <%= paginate @users %> とかで諸々表示されそうな気がしますが...表示されないのかなぁ。 現在のusers_controllerとusers/index.html.erbファイルがどうなっているか拝見したいので、質問の欄を編集してコードを貼っていただけると嬉しいです。
hiratashinichi

2021/06/16 13:18

はい。users_controller.rbは class UsersController < ApplicationController def index @users = User.page(params[:page]).per(1) end end index.html.erb内は質問の通り以下に書き換えてみました。 <% @users.each do |user| %> <%= user.name %> <% end %> <%= paginate @users %> ちなみに私が参考にしてみたサイトのURLも載せさせていただきます。 https://qiita.com/rio_threehouse/items/313824b90a31268b0074 いろいろお手数おかけしてすいません!
hatsu

2021/06/16 13:29

上記のように書き換えた場合でもUserの名前とか表示されないのでしょうか? indexアクションをallにして def index @users = User.all end <% @users.each do |user| %> <%= user.name %> <% end %> だと流石に表示されますか?
hiratashinichi

2021/06/16 14:23

いろいろお忙しいのにありがとうございます。 上記も試して無理だったのですがこちらのサイト https://diveintocode.jp/blogs/Technology/kaminariの順番通りにすると表示させてデザインも作ることが出来ました! 私が思うのはdb/seed.rbで表示数を指定?してあげてrails db:seedを反映させる必要があったのだと感じました。 お忙しいのにたくさんの助言の方をしてくださって誠にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問