0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails】予約語に気をつけろ!!

Posted at

起きたこと

・既存のプロジェクトにメール機能を追加するにあたって、Mailモデルを作成して実装
・順調に開発が進み本番環境にデプロイしたところ、NoMethodErrorが発生

【エラー内容】

undefined method `eager_autoload!' for Mail (call 'Mail.connection' to establish a connection):Class (NoMethodError)
Did you mean? eager_load

原因

・Rails の初期化プロセスでActionMailerのeager_loadを実行
・その中で Mail.eager_autoload! を呼んでいる(どうやらMailモデルがあるみたい)
・しかし自身が作成したMailクラスにはeager_autoload!が存在しない → NoMethodError

なぜ開発環境では起きなかったの?

・development.rbではconfig.eager_load = falseとなっておりproduction.rbではこれがtrueだったので開発環境では発生しなかった。

反省

・安易にモデル名を決めてしまった(後になって思えば流石にMailモデルはどこかで使われている可能性が高そう)
・Railsの継承元のモデル名も干渉するという視点がなかった

終わりに

・モデル名の変更により実装した部分の大多数を変更後のモデル名で書き直す必要がありかなり時間と労力を使ったので二度と同じ過ちは繰り返したくない。。

余談

・関連するモデルでMailMediaというモデルを作っていたが、スキーマファイルを作成する際、mail_mediasというテーブル名で作成していたところ、mail.mail_mediasを呼び出す際に「mail_mediaなんてテーブルはない」というエラーが発生していた。
・調べるとmediaの複数形はmediaなので、Railsさんが自動的に複数形変換してくれてmail_mediaテーブルを探しに行ってくれてたってわけ。
・今回は運用のしやすさという観点からself.table_name = 'mail_medias'をMailMediaモデルに記述して対応

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?