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

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

ただいまの
回答率

90.61%

  • Ruby on Rails

    6988questions

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

NoMethodError についての質問

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 557

keiiti

score 9

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

自分のコードは以下です

articles_controller.rb

  def new
  end


  def create 
      @article = Article.new(article_params)
      @article.save
      redirect_to article_path(@article)
  end

  def article_params 
      params.require(:article).permit(:title,:text)
  end

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

  def index 
    @articles = Article.all
  end

articles/show.html.erb

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

db/migrate/..._create_articles.rb

class CreateArticles < ActiveRecord::Migration[5.0]
  def change
    create_table :articles do |t|
      t.string :title
      t.text :text

      t.timestamps
    end
  end
end

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

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

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


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/14 18:36

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/14 18:37

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

    キャンセル

  • 2017/09/14 19:44

    エラー発生時のURLが知りたいです。

    それと
    def show
    @article = Article.find params[:id]
    puts "--------------デバッグ-----------------"
    puts @article
    puts "---------デバッグ---------------"
    end

    でやった時にログに@articleの中身が出力されるので、全部コピーしてこちらに貼ってください。

    キャンセル

  • 2017/09/16 18: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>

    このログで正しいでしょうか?

    キャンセル

  • 2017/09/16 23:24

    ```
    5: <h1> <%= @article. title %> </h1>
    6: <p> <%= @article. text %> </p>
    ```
    おかしな空白が入っていますね....
    書き直して見てください。

    もしこれで治らなければ、
    routes.rbの中身も教えてください。
    resources :articlesとなっていますか?

    キャンセル

  • 2017/09/17 11: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

    キャンセル

0

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

@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/23 15: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になっているということでしょうか?

    もし可能であればこの変更方法をご教示頂けませんか?

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    NoMethodError in Users::Configurations#indexのエラーの直...

    現在複数のWebページでrailsの勉強をしています。 そこでユーザの名前の変更ができる機能とユーザを一覧表示させるのではなく、個人の名前やメールアドレスは個人しか見えないように

  • 解決済

    NoMethodErrorと出てしまう

    前提・実現したいこと 与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ. 英小文字ならば(219 - 文字コード)の文字に置換 その他の文字はそ

  • 解決済

    NoMethodErrorの内容がよく理解できません

    前提・実現したいこと RPG用のキャラクター作成プログラムを作成しようとしています。 基本能力にボーナスポイントを割り振る機能である「assignment」メソッドを実装中に以

  • 受付中

    NoMethodError undefined methodのエラー

    NoMethodError in HomeController#index undefined method `id' for nil:NilClass とエラーが出ました。

  • 解決済

    【Ruby on Rails】ブログサイトでコメント機能の関連付けができません。

    前提・実現したいこと Ruby(Ruby on Rails)でブログサイトを作っています。 ログインユーザーがコメントをするような仕組みと想定しているのですが、どのようにして記

  • 受付中

    railsにてNoMethodErrorエラー

    前提・実現したいこと デフォルトの画像設定が上手くいきません。 Progateで学習した内容をcloud9を使って復習しているのですが標題のエラーで詰まっています。 過去の質問

  • 解決済

    Ruby on RailsでNoMethodErrorが出ます

     前提・実現したいこと ドットインストールを見ながら第12回目(https://dotinstall.com/lessons/basic_rails_v3/41812)まで実際に作

  • 解決済

    noMethodErrorについて

    表題のエラーが発生しております。 Rubyはほとんど触ったことがなく、簡単な質問で恐縮ですが @postを定義しているのでメソッドがない、未定義ではないと認識しているのですが、 @

同じタグがついた質問を見る

  • Ruby on Rails

    6988questions

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