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

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

詳細はこちら
Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

3615閲覧

Railsのeach文エラー

KeiyaShimizu

総合スコア7

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2019/09/26 07:02

Ruby on Rails でeach文を使おうとすると、エラーが発生しました。

Rails でeach文を使おうとしたら、NoMethodErrorが発生しました。
データベースのPostsテーブルからcontentというカラムのデータを取り出し表示するつもりです。
他の質問を見て自分なりに解決策を探しましたが、解決には至りませんでした、、、
このエラーの解決策をご教授ください。

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

NoMethodError in Posts#index undefined method `each' for nil:NilClass --- Extracted source (around line #3): <h1>Postのindex</h1> <p>ここはインデックス</p> <% @post.each do |post| %> **ここが赤く表示** <%= post.content %> <% end %>

該当のソースコード

ruby

1###view 2<h1>Postのindex</h1> 3<p>ここはインデックス</p> 4<% @post.each do |post| %> 5 <%= post.content %> 6<% end %> 7 8###controller 9class PostsController < ApplicationController 10 def index 11 @post = Post.all 12 end 13 14###routes 15Rails.application.routes.draw do 16 get 'posts/index', to:'posts#index' 17end 18

試したこと

each文の文法が正しいことは確認しました。
コンソールより、Postsテーブルのcontentカラムにテキストが保存されていることは確認しました。localhost:3000/posts/indexを開こうとするとこのエラーが出ます。

他の質問から、
<% @post.each do |post| %>の@postがnilである、というところまでは他の質問で
理解出来ましたが、コントローラーには

class PostsController < ApplicationController
def index
@post = Post.all
end

と記述しており、@postを定義出来ていると思うのですが、、、

補足情報(

rails -v 6.0.0

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

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

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

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

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

Mugheart

2019/09/26 07:20

今の情報だけでは原因はわかりませんが、Post.all が何を返しているのかデバッグしてみてください。 ActiveRecord_Relation が返っているかどうかで見るべき箇所も変わってきます。
KeiyaShimizu

2019/09/26 07:44

下記のようにコンソールでPost.allでid,content,created_at,updated_atを含む3つのデータが返ってきました。 /// => #<ActiveRecord::Relation ///も返ってきてます。 irb(main):001:0> Post.all (5.5ms) SELECT sqlite_version(*) Post Load (1.7ms) SELECT "posts".* FROM "posts" LIMIT ? [["LIMIT", 11]] => #<ActiveRecord::Relation [ #<Post id: 1, content: "today's work", created_at: "2019-09-23 10:25:27", updated_at: "2019-09-23 10:25:27">, #<Post id: 2, content: "hello", creat ed_at: "2019-09-23 12:22:07", updated_at: "2019-09-23 12:22:07">, #<Post id: 3, content: "test", created_at: "2019-09-26 05:59:52", updated_at: "2019-09-26 05:59:52">]>
Mugheart

2019/09/26 07:46 編集

コンソールではなくPostsController#index内でデバッグできますか?
KeiyaShimizu

2019/09/26 08:34

デバッグの方法があっているかわかりませんが、、 コントローラーを class PostsController < ApplicationController def index @post = Post.all logger.debug(@post) end end として、 log/development.logでは ActionView::Template::Error (undefined method `each' for nil:NilClass): 1: <h1>Postのindex</h1> 2: <p>ここはインデックス</p> 3: <% @post.each do |post| %> 4: <%= post.content %> 5: <% end %> app/views/posts/index.html.erb:3 となりました。 調べたところviewに何か問題があると書かれているサイトがありました。
Mugheart

2019/09/26 08:37

えーと、 def index byebug @post = Post.all end として、Postのindexページを開こうとすると、ターミナルのログが止まってコンソールモードになります。 そこで Post.all を実行して戻り値を確認してください。 ターミナルのログが止まらない場合はそこを経由できていないということなので、その場合はそう教えてください。
KeiyaShimizu

2019/09/26 09:02

Running byebug 11.0.1 を確認して、 def index byebug @post = Post.all end もう一度localhost:3000/posts/indexを開いたら、先ほどと同じエラー画面になり その画面のコンソールからPost.allを入力すると、 => #<ActiveRecord::Relation [ #<Post id: 1, content: "today's work", created_at: "2019-09-23 10:25:27", updated_at: "2019-09-23 10:25:27">,  #<Post id: 2, content: "hello", created_at: "2019-09-23 12:22:07", updated_at: "2019-09-23 12:22:07">,   #<Post id: 3, content: "test", created_at: "2019-09-26 05:59:52", updated_at: "2019-09-26 05:59:52"> ]> が出力されました。 logは ////// Started GET "/posts/index" for ::1 at 2019-09-26 17:56:01 +0900 Processing by PostsController#index as HTML Rendering posts/index.html.erb within layouts/application Rendered posts/index.html.erb within layouts/application (Duration: 1.1ms | Allocations: 1188) Completed 500 Internal Server Error in 4ms (ActiveRecord: 0.0ms | Allocations: 1681) ActionView::Template::Error (undefined method `each' for nil:NilClass): 1: <h1>Postのindex</h1> 2: <p>ここはインデックス</p> 3: <% @post.each do |post| %> 4: <%= post.content %> 5: <% end %> app/views/posts/index.html.erb:3 Started PUT "/__web_console/repl_sessions/62f85a86e00d574dfae4b82d8ac2b5c5" for ::1 at 2019-09-26 17:57:06 +0900 Started PUT "/__web_console/repl_sessions/62f85a86e00d574dfae4b82d8ac2b5c5" for ::1 at 2019-09-26 17:57:09 +0900 Started PUT "/__web_console/repl_sessions/62f85a86e00d574dfae4b82d8ac2b5c5" for ::1 at 2019-09-26 17:57:10 +0900 Post Load (0.5ms) SELECT "posts".* FROM "posts" LIMIT ? [["LIMIT", 11]] ////// です
Mugheart

2019/09/26 09:13

すみません、エラー画面が表示された後にコンソールから入力したのがよくわかりません。 普通は表示前に画面が止まってコンソールになるので。 おそらくlocalhost:3000/posts/indexを開くのにそのメソッドを通ってないのでは?
Mugheart

2019/09/26 09:16 編集

試しにindexメソッド内の@postにnil以外の値をなんでもいいので(数字とか文字列とか)与えてもらって普通に表示させてもらえますか? そのメソッドを通っていれば画面表示かエラー内容が変わりますが、通ってないのであればエラー内容は変わらないです。
KeiyaShimizu

2019/09/26 13:09

調べたらRails 4.2から導入されたweb-consoleのことでした。デフォルトエラーページ用のデバッギングツールのようです。自分はそれにPost.allを入力しました。 @post = 2019 として開いてみてもエラー画面、画面表示は全く変わりませんでした。 Mugheartさんの言う通り、indexメソッドを通っていない可能性が高そうです、、
KeiyaShimizu

2019/09/27 06:27

PCを再起動して、byebugの記述をなくし、 ルーティングを Rails.application.routes.draw do get 'index', to:'posts#index' end にし、それに伴いapplication.html.erbの記述も <li><%= link_to("投稿一覧", "/index") %></li> にしてみたら問題なく動きました。 Mugheartさん、 私の稚拙な質問に答えていただき、ありがとうございました!
guest

回答1

0

ベストアンサー

@postを定義出来ていると思うのですが、、、

定義ができていても、その中身にnilが入っているということです。

たとえば、 a = nil と定義した場合、a は定義されていますが、aはnilです。
同様に@postにnilが代入されている(nilが含まれている)ということになります。

投稿2019/09/26 07:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問