知らなきゃ損?Rails【超】初心者から脱出するためのエラー間違い探し5選


環境

  • mac OS Catalina 10.15.6
  • Ruby 2.6.3
  • Rails 6.0.3.2

はじめに

「エラーメッセージ読めばわかるだろ!」というようなエラーでも、超初心者の頃は検討もつかずとりあえずGoogle先生に頼ります。
この記事はそんな「とりあえずエラーメッセージをコピペしてググります」レベルのRuby on Rails超初心者に向けて書いたあるあるエラーの対処法の記事です。

例題1: エラーメッセージの日本語化がうまくいかない…(NoMethodError (undefined method `deep_symbolize_keys')

I18nを使ってエラーメッセージを日本語化しよう!

参考:Rails で I18n を使って日本語化

よし!Webからダウンロードした日本語ファイルを設定したぞ

ja.yml

ja:
activerecord:
errors:
messages:
record_invalid: "バリデーションに失敗しました: %{errors}"
restrict_dependent_destroy:
has_one: "%{record}が存在しているので削除できません"
has_many: "%{record}が存在しているので削除できません"

あれ?なんだかエラーが…

NoMethodError (undefined method `deep_symbolize_keys' for "文字列":String):

どういう意味だろう?

エラーの原因

config > locales > ja.yml のインデントが間違っていて、i18nの翻訳がうまくいっていません。

エラーの解決法

要素ごとにインデントを半角スペース2個下げるのが正しい記述。
コピペだとインデントがずれることがあるため、コマンドでファイルをダウンロードしてconfig > locales フォルダ配下に配置する。

# 日本語の翻訳ファイルのテンプレートをダウンロード
wget https://raw.github.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml -P config/locales/
ja:
  activerecord:
    errors:
      messages:
        record_invalid: "バリデーションに失敗しました: %{errors}"
        restrict_dependent_destroy:
          has_one: "%{record}が存在しているので削除できません"
          has_many: "%{record}が存在しているので削除できません"

参考

NoMethodError (undefined method `deep_symbolize_keys' for "こんにちは":String):

Ruby on Railsの標準ではエラーメッセージが英語で表示されるので、ユーザーがわかりやすいよう日本語化する。

Railsで日本語化対応にする方法

Railsのバリデーションエラーのメッセージの日本語化 - Qiita

例題2: Partialを読み込んだViewが表示されない…(Missing partial)

posts/index.html.erbからcomments配下の_comment.html.erbを読み込もうとしています。

フォルダ構成

app
 - views
    - posts
        - index.html.erb
    - comments
        - _comment.html.erb
posts/index.heml.erb
  <%= render partial: "comment" %>

あれ?エラーが…

Missing partial xxx/_yyy, application/_yyy with {:locale=>[:ja], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}.

エラーの原因

partialのviewのパスの指定が間違っています。

解決法

partialのviewをrenderする(読み込む)際は、フォルダ名/ビュー名でパスを指定する。

posts/index.heml.erb
  <%= render partial: "comments/comment" %>

フォルダ階層を指定してなかったから、読み込めなかったのね〜。

例題3: rails sしてもViewが表示できない…(missing a template for this request format and variant.)

<コントローラ名>Controller#<アクション名> is missing a template for this request format and variant. request.formats: ["text/html"] request.variant: []

エラーの原因

コントローラーのアクションに対応するviewが存在しない 

解決法

app > views >  コントローラ名のフォルダ配下に「アクション名.html.erb」を作成する
※拡張子は.slimや.hamlなど適用形式による

例題4: コードは合ってるはずなのに、プログラムを実行できない…(undefined local variable or method ` ')

undefined local variable or method ` ' for #<xxxxx> (NameError)

何が悪いんだろう…

posts/index.html.erb
   <%= render partial: "comment" %>

エラーの原因

実は全角スペースがファイル内に入っています。

解決法

全角スペースを削除する。
IDEの設定で全角スペースを発見できるようにする。

参考

改修後にrailsアプリで急にActionController::RoutingErrorが出るようになった時の対処法

例題5: JavaScriptがうまく読み込まれない…(ExecJS::RuntimeError unclosed regex)

RailsのエラーはRubyに依存するとは限りません。

ExecJS::RuntimeError in Controller#Action
SyntaxError: missing / (unclosed regex)

unclosed regexとは…?

エラーの原因

app > assets > javascripts > .coffeeファイルの記述が間違っている。({}など、コーディングブロックが閉じていない)
そのため、view(application.html.erb)でstylesheetを読み込んでいる箇所がエラーとなっている。

apps/view/layouts/application.html.erb
  <%= stylesheet_link_tag 'application', media: 'all' %>

解決法

coffeeファイルの記述を見直す。不要な部分は削除する。

参考

Weird error "missing / (unclosed regex)"

まとめ

いかがでしたか?
つよつよエンジニアのみなさんには簡単すぎましたね!

とりあえずググるのもいいですが、一度エラーメッセージが何を言っているのかを噛み砕いてみても超初心者から成長することができます。
みなさんのプログラミングの勉強を応援しています!