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

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

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

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

Q&A

3回答

8234閲覧

NoMethodError についての質問

keiiti

総合スコア29

Ruby on Rails

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

1グッド

0クリップ

投稿2017/09/13 08:01

NoMethodError in Articles#show
undefined method `title' for nil:NilClass というエラーが出ました。

自分のコードは以下です

articles_controller.rb

Ruby

1 2 def new 3 end 4 5 6 def create 7 @article = Article.new(article_params) 8 @article.save 9 redirect_to article_path(@article) 10 end 11 12 def article_params 13 params.require(:article).permit(:title,:text) 14 end 15 16 def show 17 @article = Article.find params[:id] 18 end 19 20 def index 21 @articles = Article.all 22 end 23 24 25

articles/show.html.erb

Ruby

1 <%= @article.title %> 2 <%= @article.text %>

db/migrate/..._create_articles.rb

Ruby

1class CreateArticles < ActiveRecord::Migration[5.0] 2 def change 3 create_table :articles do |t| 4 t.string :title 5 t.text :text 6 7 t.timestamps 8 end 9 end 10end

どの部分でエラーが起きているのかがわかりません
どなたかお助けください。
よろしくお願いします

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答3

0

undefined method `title' for nil:NilClass
はNilClassにtitleメソッドが存在しないエラーです。

Ruby

1@article = Article.find params[:id]

上のコードのfindメソッドはレコードがない場合はundefined method 'title' for nil:NilClassの前に
Record Not Foundというエラーになります。

ですので
undefined method `title' for nil:NilClassが出るのはちょっとおかしいですね

そこで考えられるのが意図しないコントローラが呼び出されている可能性があることです。
ブラウザにアクセスする際にターミナルへrails sコマンドを打ち込んでいると思いますが、そのターミナル内に
エラーページへアクセスした際以下の様にログが流れると思います。
以下の画像では"/"にアクセス時にtop_controller.rbのindexメソッドが呼び出されているのがわかると思います。

![イメージ説明]

Processing by ArticlesController#show
の様にarticles_controller.rbのshowメソッドが呼び出されているか確認してみてください。

投稿2017/09/21 13:02

y_y3

総合スコア179

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

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

keiiti

2017/09/23 06:54

アドバイスありがとうございます! y_y3さんがおっしゃる通り、以下のようなログでした。 Started GET "/articles/1" for 127.0.0.1 at 2017-09-23 15:49:23 +0900 Processing by ArticlesController#show as HTML Parameters: {"id"=>"1"} User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 6], ["LIMIT", 1]] Rendering articles/show.html.erb within layouts/application Rendered articles/show.html.erb within layouts/application (8.1ms) Completed 500 Internal Server Error in 40ms (ActiveRecord: 0.7ms) エラーの根源はこれだったのですね。。。 article/controller/showに飛んで欲しいのに app/controller/showになっているということでしょうか? もし可能であればこの変更方法をご教示頂けませんか?
guest

0

バグをとりあえず解消するだけでいいなら
<%= @article&.title %>
で大丈夫です。

おそらく該当のarticleにはtitleがないということだと思います。
エラーが出ているarticleのデータを確認してみてください。

投稿2017/09/13 09:07

glvty83

総合スコア135

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

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

keiiti

2017/09/14 09:37

回答ありがとうございます。 アドバイスに従い、書き換えてみたのですが、同じエラーが表示されてしまいます。 他にどのようなコードをお見せするとわかりやすいですか? お手数おかけします
glvty83

2017/09/14 10:44

エラー発生時のURLが知りたいです。 それと def show @article = Article.find params[:id] puts "--------------デバッグ-----------------" puts @article puts "---------デバッグ---------------" end でやった時にログに@articleの中身が出力されるので、全部コピーしてこちらに貼ってください。
keiiti

2017/09/16 09:16

エラー発生時のURLは localhost:3000/articles/1  ※最後の部分は1,2,3,4,5... 全てで起きます。 ログ情報は ActionView::Template::Error (undefined method `title' for nil:NilClass): 2: 3: 4: 5: <h1> <%= @article. title %> </h1> 6: <p> <%= @article. text %> </p> このログで正しいでしょうか?
glvty83

2017/09/16 14:24

``` 5: <h1> <%= @article. title %> </h1> 6: <p> <%= @article. text %> </p> ``` おかしな空白が入っていますね.... 書き直して見てください。 もしこれで治らなければ、 routes.rbの中身も教えてください。 resources :articlesとなっていますか?
keiiti

2017/09/17 02:19

@article.title のように空白を埋めてみましたが、同じエラーが発生しました。 以下はconfig/routes.rb の中身です。 Rails.application.routes.draw do get 'users/index' get 'users/show' devise_for :admin_users, ActiveAdmin::Devise.config ActiveAdmin.routes(self) devise_for :users, controllers: { sessions: 'users/sessions', registrations: 'users/registrations', passwords: 'users/passwords', } resource :users, :only => [:show] resources :users, only: [:index] resources :users, only: [:edit] get 'users/:id' => 'users#show' #マイページ # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root 'top#index' resources :articles #stripe resources :charges end
guest

0

nilということは値が入ってないということを指してます。
コードを見た限りでコントローラーのfindメソッドのあたりの書き方が違うことによって、
うまく動作せずに変数にnilが入っている状態になっているんではないかとおもいます。
articles_controller.rbの中の

ruby

1def show 2 @article = Article.find params[:id] 3end

showメソッドのfindメソッドの括弧()がないことが原因だと思います
下記のように変更すれば解決すると思います。

ruby

1def show 2 @article = Article.find(params[:id]) 3end

投稿2017/09/13 08:47

編集2017/09/13 08:49
namakemonoHuman

総合スコア53

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

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

keiiti

2017/09/14 09:36

回答ありがとうございます。 アドバイスいただいた通りに書き換えてみたのですが、同じエラーが表示されてしまいました。 article index の方では保存したデータを表示できるのですが、article showの方で表示ができません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問