プログラミング初心者の勉強メモ。

あくまでメモなので、自分が忘れそうなことだけちょこちょこ書いてます。

ActionView::MissingTempleteとの戦い

投稿機能を作成するために、toppagesフォルダ内にindex.html.erbを作成したのですが、ActionView::MissingTemplete in Toppages#indexというエラーが発生しました。

エラーの原因を探る

ということでまずはなぜエラーなのか原因の説明が理解できないので、日本語訳を見ながらまずは怒られている内容を確認しました。

パターン①:ディレクトリ(フォルダ)の場所が違う

ざっくりとした日本語訳だと、「Toppages(controller)のindexアクションでviewを返そうとしたけど、テンプレートがなくて上手くいかない」と言っているそうです。

f:id:over54:20200621213849p:plain

主な原因としては、「controllerで設定しているアクションの、viewが設定されていない場合に発生するエラー」らしいので、とりあえず僕はToppages(controller)やviewにtoppages#indexが作成されているか調べたのですが、自分では異常を見つけられず。

現役エンジニアの方に相談したところ、ファイルを入れておくフォルダのミスでした。

本来micropostsディレクトリ(フォルダ)内に作成したerbを保存すべきなのですが、勝手に_microposts.html.erbディレクトリ(フォルダ)を作ってそこに保存してました。

ということでmicropostsディレクトリ(フォルダ)に移動。

f:id:over54:20200621220102p:plain
f:id:over54:20200621215941p:plain

これでOKかと思いきや、今度は別のエラーが。

パターン②:スペルミスによる読み込みエラー(その1)

f:id:over54:20200621220444p:plain

内容の部分を見ると、_microposts.html.erbのファイルにミスがあるとのこと。

15行目の構文がエラーのようです。よく見たらスペルミス(pagenateは本来paginate)があったので即修正。

これで何とかブラウザに映りました。

パターン③:スペルミスによる読み込みエラー(その2)

f:id:over54:20200701024219p:plain

「Users(controller)のshowアクションでviewを返そうとしたけど、テンプレートがなくて上手くいかない」とご指導を受けています。今回の場合はディレクトリ(フォルダ)の場所やviewファイルの作成等の問題はなく、原因は17行目のrenderのスペルミスやスペース空け忘れが原因でした。

具体的には、

正しいコード <%= render "relationships/follow_button", user: @user %>

間違えコード <%= render "relationships/_follow_button", user:@user %>

と書いていました。

  1. renderでディレクトリ(フォルダ)を読み込む時は「ディレクトリ名(フォルダ名)/ ファイル名」と書きますが、今回はパーシャルのファイルを読み込んだので、コピペで "_" の部分も記述してしまったこと
  2. "user:" と "@user" の半角スペースを空けなかったこと

が原因で、「そんなテンプレート(ファイル)は無い!」と言われたようです。