LoginSignup
0
0

More than 5 years have passed since last update.

もそ、プログラミングを学ぶ【Ruby & Rails復習編】〜どんどんエラーを解いてみよう!〜

Last updated at Posted at 2019-04-17

エラーを克服せよ

エラー解決の数をこなしていくうちに、プログラミングスキルが徐々に覚醒しつつある もそ。
前はあまりにエラーが解決できず奇声を発しそうになっていたのですが、だんだんと考え方のコツをつかんで落ち着きを取り戻した今、波紋の呼吸を修得しつつあります。
プログラミングだし、スタンド名はOKコンピューターとかがいいかな〜

無題1180.jpeg

...さっそく話がそれてしまいました。
今回も引き続き、エラーを解決していこうと思います。

エラー発生!名探偵もそ、出動!

まずはエラー画面を見てみましょう。

0403.png

精神を乱さず、まずは冷静に英文を読みます。

1行目を読んでみると「NoMethodError in Tweets#index」と表示されていますよね。
これは、

「tweetsコントローラのindexアクションを読み込んだ時に、メソッドがなかったよ〜」

という内容です。
さらに2行目を見てみると、「部分テンプレートファイルの6行目に記述しているtweet__pathの部分でメソッドが定義されていない」と出ています。

仮説を立ててみる

これまでの経験と勘から、”NoMethodError”と出ているのでメソッドの名前とコントローラのアクションが一致していないのでは?と考えました。

そこで改めて部分テンプレートファイルの記述を確認してみます。
でも、詳細ページを表示するためのHTTPメソッドはgetで合っているはず。

う〜〜む、これは難題な予感です。

無題1178.jpeg

名探偵もそ、ターミナルを捜査(操作)

ここでエラーの原因箇所がビューファイルにない可能性も考え、ターミナルにrake routesコマンドを実行しました。
rake routesすることでルーティング名やルートパス、コントローラとアクションに対応するHTTPメソッドを確認することができます。

ここで実際のrake routes結果を見てみましょう。
0403-1.png

表示されている内容についてカンタンに説明します。
薄きみどり色(もそカラーをイメージして設定してみました)の1列目の表記ですが、

・Prefix...ルーティング名
・Verb...HTTPメソッド
・URI Pattern...ルートパス名
・Controller#Action...コントローラ名#アクション名

を表しています。

画像内の下の方、ブルーボックスで中途半端に選択してしまっている

tweets  GET   /tweets(.:format)  tweets#index

この部分が今回エラーを起こした処理になります。
思ったとおり、HTTPメソッドはやはり間違っていないようです。
原因はどこにあるのか...ターミナルの実行画面を見ていると、もそはハッと気がつきました。

「あれ?ほかのtweetsコントローラ全然表示されてなくない??」

本来であれば、tweetsコントローラのファイルで定義した各アクションが並ぶはずです。
でも実行結果をよく見ると、tweetsコントローラのindexアクションしか表示されていません

エラー解決編

この結果を踏まえて、原因はルーティングにあると断定しました。

コントローラファイルの記述がごっそり抜けている可能性もなくはないのですが、この部分は30弱の記述があります。
この部分がまるっと無くなっていたらさすがに気がつくだろうと考え、今回は先にルーティングを検証することにしました。

さっそくルーティングファイルを開き、記述を確認してみます。

error_routing.rb
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メソッドをネストという入れ子構造にしています。
そんなわけで、正しい記述はこちら↓

routing.rb
Rails.application.routes.draw do
  devise_for :users
  root  "tweets#index" 

resources :tweets do
  resources :comments, only: [:create]
end
  resources :users, only: [:show]
end

なかなかの難題でしたが、名探偵もそ、見事に解決しました!

無題1185.jpeg

--
エラー解決は難しいですが、解けるとなるほど面白い!もっと頑張ろう!と前向きな気持になれます。
次の目標も決まってきたので(※スタンド発動ではありません)、復習をしつつエラーに挑戦していこうと思います。
...続く。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0