エラーを克服せよ
エラー解決の数をこなしていくうちに、プログラミングスキルが徐々に覚醒しつつある もそ。
前はあまりにエラーが解決できず奇声を発しそうになっていたのですが、だんだんと考え方のコツをつかんで落ち着きを取り戻した今、波紋の呼吸を修得しつつあります。
プログラミングだし、スタンド名はOKコンピューターとかがいいかな〜
...さっそく話がそれてしまいました。
今回も引き続き、エラーを解決していこうと思います。
エラー発生!名探偵もそ、出動!
まずはエラー画面を見てみましょう。

精神を乱さず、まずは冷静に英文を読みます。
1行目を読んでみると「NoMethodError in Tweets#index」と表示されていますよね。
これは、
「tweetsコントローラのindexアクションを読み込んだ時に、メソッドがなかったよ〜」
という内容です。
さらに2行目を見てみると、「部分テンプレートファイルの6行目に記述しているtweet__path
の部分でメソッドが定義されていない」と出ています。
仮説を立ててみる
これまでの経験と勘から、”NoMethodError”と出ているので**メソッドの名前とコントローラのアクションが一致していないのでは?**と考えました。
そこで改めて部分テンプレートファイルの記述を確認してみます。
でも、詳細ページを表示するためのHTTPメソッドはgetで合っているはず。
う〜〜む、これは難題な予感です。
名探偵もそ、ターミナルを捜査(操作)
ここでエラーの原因箇所がビューファイルにない可能性も考え、ターミナルにrake routesコマンドを実行しました。
rake routesすることでルーティング名やルートパス、コントローラとアクションに対応するHTTPメソッドを確認することができます。
表示されている内容についてカンタンに説明します。
薄きみどり色(もそカラーをイメージして設定してみました)の1列目の表記ですが、
・Prefix...ルーティング名
・Verb...HTTPメソッド
・URI Pattern...ルートパス名
・Controller#Action...コントローラ名#アクション名
を表しています。
画像内の下の方、ブルーボックスで中途半端に選択してしまっている
tweets GET /tweets(.:format) tweets#index
この部分が今回エラーを起こした処理になります。
思ったとおり、HTTPメソッドはやはり間違っていないようです。
原因はどこにあるのか...ターミナルの実行画面を見ていると、もそはハッと気がつきました。
「あれ?ほかのtweetsコントローラ全然表示されてなくない??」
本来であれば、tweetsコントローラのファイルで定義した各アクションが並ぶはずです。
でも実行結果をよく見ると、tweetsコントローラのindexアクションしか表示されていません。
エラー解決編
この結果を踏まえて、原因はルーティングにあると断定しました。
コントローラファイルの記述がごっそり抜けている可能性もなくはないのですが、この部分は30弱の記述があります。
この部分がまるっと無くなっていたらさすがに気がつくだろうと考え、今回は先にルーティングを検証することにしました。
さっそくルーティングファイルを開き、記述を確認してみます。
Rails.application.routes.draw do
devise_for :users
root "tweets#index" do
resources :tweets
resources :comments, only: [:create]
end
resources :users, only: [:show]
end
よ〜〜く見てみましょう。
...
...!!!
3行目のdoの記述位置、間違ってるやん!!
resourcesメソッドはコントローラとアクションの設定をかんたんに行ってくれる便利なメソッドで、基本となるコントローラの7つのアクション名に対して、ルーティングを自動で生成してくれます。
詳しくはこちらの記事へ。
記述の仕方はこんな感じです。↓
resources :コントローラ名 do
さらにここでは、resourcesメソッドをネストという入れ子構造にしています。
そんなわけで、正しい記述はこちら↓
Rails.application.routes.draw do
devise_for :users
root "tweets#index"
resources :tweets do
resources :comments, only: [:create]
end
resources :users, only: [:show]
end
なかなかの難題でしたが、名探偵もそ、見事に解決しました!
--
エラー解決は難しいですが、解けるとなるほど面白い!もっと頑張ろう!と前向きな気持になれます。
次の目標も決まってきたので(※スタンド発動ではありません)、復習をしつつエラーに挑戦していこうと思います。
...続く。