ActionView::MissingTempleteとの戦い
投稿機能を作成するために、toppagesフォルダ内にindex.html.erbを作成したのですが、ActionView::MissingTemplete in Toppages#indexというエラーが発生しました。
エラーの原因を探る
ということでまずはなぜエラーなのか原因の説明が理解できないので、日本語訳を見ながらまずは怒られている内容を確認しました。
パターン①:ディレクトリ(フォルダ)の場所が違う
ざっくりとした日本語訳だと、「Toppages(controller)のindexアクションでviewを返そうとしたけど、テンプレートがなくて上手くいかない」と言っているそうです。
主な原因としては、「controllerで設定しているアクションの、viewが設定されていない場合に発生するエラー」らしいので、とりあえず僕はToppages(controller)やviewにtoppages#indexが作成されているか調べたのですが、自分では異常を見つけられず。
現役エンジニアの方に相談したところ、ファイルを入れておくフォルダのミスでした。
本来micropostsのディレクトリ(フォルダ)内に作成したerbを保存すべきなのですが、勝手に_microposts.html.erbディレクトリ(フォルダ)を作ってそこに保存してました。
ということでmicropostsディレクトリ(フォルダ)に移動。
これでOKかと思いきや、今度は別のエラーが。
パターン②:スペルミスによる読み込みエラー(その1)
内容の部分を見ると、_microposts.html.erbのファイルにミスがあるとのこと。
15行目の構文がエラーのようです。よく見たらスペルミス(pagenateは本来paginate)があったので即修正。
これで何とかブラウザに映りました。
パターン③:スペルミスによる読み込みエラー(その2)
「Users(controller)のshowアクションでviewを返そうとしたけど、テンプレートがなくて上手くいかない」とご指導を受けています。今回の場合はディレクトリ(フォルダ)の場所やviewファイルの作成等の問題はなく、原因は17行目のrenderのスペルミスやスペース空け忘れが原因でした。
具体的には、
正しいコード <%= render "relationships/follow_button", user: @user %>
間違えコード <%= render "relationships/_follow_button", user:@user %>
と書いていました。
- renderでディレクトリ(フォルダ)を読み込む時は「ディレクトリ名(フォルダ名)/ ファイル名」と書きますが、今回はパーシャルのファイルを読み込んだので、コピペで "_" の部分も記述してしまったこと
- "user:" と "@user" の半角スペースを空けなかったこと
が原因で、「そんなテンプレート(ファイル)は無い!」と言われたようです。