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

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

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

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

606閲覧

Ruby on RailsでNoMethodErrorが出ます

momoka_sumikko

総合スコア7

Ruby on Rails 5

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/03/04 09:04

編集2018/03/04 10:43

前提・実現したいこと

ドットインストールを見ながら第12回目(https://dotinstall.com/lessons/basic_rails_v3/41812)まで実際に作って進めていたんですが、show.html.erbを作成してブラウザで確認すると、以下のエラーメッセージが発生しました。
環境はローカル開発環境ではなくmacで行っています。
動画どおり順を追ってやってきたので、データベースや他のソースコードは多分用意されていると思います。

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

NoMethodError in Posts#show undefined method `title' for nil:NilClass Extracted source (around line #1): 1 <h2><%= @post.title %></h2> 2 <p><%= @post.body %></p>

該当のソースコード

show.html.erbのソースコード

ruby

1<h2><%= @post.title %></h2> 2<p><%= @post.body %></p>

post_controller.rbのソースコード

Ruby

1class PostsController < ApplicationController 2 def index 3 @posts = Post.all.order(created_at: 'desc') 4 end 5 6 def show 7 @post = Post.find(params[:id]) 8 end 9end

データベース内のテーブルpostsの中身

sqlite> select * from posts; id title body crea upda ---- ------------- ---- ---- ---- 1 title 0 body 0 2018-03-04 07:37:47.681182 2018-03-04 07:37:47.681182 2 title 1 body 1 2018-03-04 07:37:47.686789 2018-03-04 07:37:47.686789 3 title 2 body 2 2018-03-04 07:37:47.691107 2018-03-04 07:37:47.691107 4 title 3 body 3 2018-03-04 07:37:47.695788 2018-03-04 07:37:47.695788 5 title 4 body 4 2018-03-04 07:37:47.700430 2018-03-04 07:37:47.700430

routes.rbの中身

ruby

1Rails.application.routes.draw do 2 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 3 4 resources :posts 5 6 root 'posts#index' 7end

試したこと

データベースにはtitle、bodyの要素を持ったpostsというテーブルがあることを確認済みです。
ソースコードのpostの部分、postsに変えてみても同じエラーが出ました。
今までのmyblogフォルダを一度消してもう一度最初から作り直しても変わりませんでした。

関係ないかもしれませんが、CSSもすぐに反映されないので、
$ bundle exec rake assets:precompile
を実行しましたが、直っていません。

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

Rails v5.1.5
Ruby v2.5.0
初心者なので、質問に足りない情報があると思います。
あればそれも教えてください。

###追記
①アクセスしたURL(最後の数字は記事のIDによって変わります)
http://[自分のIPアドレス]:3000/posts/3
②routes.rbの内容をソースコードのところに載せました
③show.html.erb のファイルパス
/Users/ユーザー名/Programming/Rails/myblog/app/views/posts/show.html.erb

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

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

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

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

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

scivola

2018/03/04 09:48

①アクセスしたURL,②config/routes.rb,③show.html.erb のファイルパスを追記してもらえますか。
scivola

2018/03/04 10:35

ごめんなさい,②は中身が知りたかったのでした。
momoka_sumikko

2018/03/04 10:44

いえいえ、こちらこそ情報不足ですいません。ありがとうございます。
guest

回答3

0

ベストアンサー

(いちおう回答欄に書きますが,回答にはなってないです)
結論を先に書くと,よくわかりませんでした。

show.html.erb の @post.title の部分で,

undefined method `title' for nil:NilClass

というエラーが出ています。これは「nil には title なんてメソッド無いけど?」ということなので,@postnil なのは間違いないです。

routes.rb で

rb

1resources :posts

となっていて,http://[自分のIPアドレス]:3000/posts/3 にアクセスしたのであれば,PostsControllershow アクションが呼ばれるのは間違いありません。
このとき,params[:id]3 なのも確かです。

show メソッドでは

rb

1@post = Post.find(params[:id])

となっていますね。Post.find(3) ですが,データベースをみると,id3 のレコードは確かに存在しているようです。
しかも,もしそんなレコードがなかったとすると,Post.find(3) は例外を発生します。nil を返したりはしません。
つまり,show メソッドで,@postnil になる可能性はありません。

この show アクションで show.html.erb がレンダリングされるわけですが,アクションのメソッドで代入したインスタンス変数がテンプレートで使われるわけですから,nil ではないはずなのに nil になっている,と。
不可解です。

もちろん,こんなことが起こる Rails アプリを〈わざと〉書こうとすれば書けますけど・・・
例えば after_action@postnil にしたり,テンプレートのどこかで @post に再代入しちゃったりとか。

以下のことを試してみてはいかがでしょうか。

rails console で Post.find(3) を試す。

show メソッドやテンプレートに byebug を仕込んで,いろんな箇所で @post の値を確認してみる。
byebug の使い方が分からなければ改めてお尋ねください。

show.html.erb のほかに show アクションのテンプレートが存在してないか(例えば show.html.slim とか)確認。

index アクションは正常なのかを確認(一覧表に title を表示させる)。

実はポート 3000 でほかのプロセスが動いてて,そっちを表示している,という可能性が無いか確認。(とりえずマシンを再起動して,アクセスしてみて,アクセスできないことを確認したうえで rails server する)

投稿2018/03/04 11:32

scivola

総合スコア2108

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

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

momoka_sumikko

2018/03/07 02:35

わかりやすい回答ありがとうございます。 Post.find(3)は上手くいっていて、indexのメソッドはちゃんと動いていました。再起動してから繋がってないことを確認して再度サーバーも立ち上げてみましたが、同じエラーのままでした(T_T) 今のところ、別のshowメソッドや@postの再代入は見つけられてません。 post_controller.rbのshowメソッドにbyebygを試してみたところ(上手に使えてるかわかりませんが)2行目に差し掛かるとこんなエラーが出ました。見にくくてすいません↓ uninitialized constant ApplicationController ["/Users/ユーザー名/Programming/Rails/myblog/app/controllers/posts_controller.rb:1:in `<top (required)>'", "/Users/ユーザー名/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/byebug-10.0.0/lib/byebug/runner.rb:186:in `debug_load'", "/Users/ユーザー名/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/byebug-10.0.0/lib/byebug/runner.rb:186:in `debug_program'", "/Users/ユーザー名/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/byebug-10.0.0/lib/byebug/runner.rb:103:in `block in run'", "/Users/ユーザー名/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/byebug-10.0.0/lib/byebug/runner.rb:102:in `loop'", "/Users/ユーザー名/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/byebug-10.0.0/lib/byebug/runner.rb:102:in `run'", "/Users/ユーザー名/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/byebug-10.0.0/exe/byebug:6:in `<top (required)>'", "/Users/ユーザー名/.rbenv/versions/2.5.0/bin/byebug:23:in `load'", "/Users/ユーザー名/.rbenv/versions/2.5.0/bin/byebug:23:in `<main>'"] また、byebygを使えるように$bundle installをすると、Gemファイルが見つからないと言われることがありました。 環境構築のときスムーズにできずいろいろ試したので、その時点で何か失敗しているんでしょうか?
guest

0

そのあともいろいろ試して、何がきっかけかはよくわからなかったんですが、$ rake db:migrate:statusを実行した後うまくいきました!
回答していただいた方、ありがとうございました(^^)

投稿2018/03/07 02:45

momoka_sumikko

総合スコア7

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

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

0

そのurlとDB状況なら、問題なさそうですね。
そのエラーは@postインスタンスが取得できてないよみたいな意味なので、pry-railsでデバッグして見るといいかもしれません。

def show   binding.pry //これ   @post = Post.find(params[:id]) end

そして、show.html.erbでも、

<% binding.pry %>

をしてみて、@postの中身を確認してみてください。

投稿2018/03/06 08:58

yukkys

総合スコア42

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問