Rails 6でundefined method クラス名が表示された場合の対処方法

Mentor

今日もRailsで発生しやすい問題の対処方法を紹介です!

 

undefined method `*****’ for Class名::Base:Class のerrorが表示された場合の対処方法。

これはnil:classと出ていない場合はスペルミスの可能性が高いです。

Railsは優しくてこれじゃないの?というが候補が出てくるので正しい値に修正しましょう!

例えば下記の場合deliveryが正しいのでdeliveryに修正します!

`raise_dilivery_errors=' for ActionMailer::Base:Class
raise_delivery_errors= # eが正しい

 

ActionMailerで発生するActionView::MissingTemplate (Missing template ‘*****’ with {******の対処方法

MissingTemplateと表示される原因はViewファイルが見つからないために表示されます。

発生する可能性の高い原因としては

  • ファイル名のファイルパスが正しくない
  • ファイル名は正しいが拡張子が間違っている。.js.erb, .html.erb, .text.erbなど。

が考えられます。

ActionMailerの場合Rails 6でmail()を使用するとhtml.erbがデフォルトで動作します。

****.html.erbが正しいファイル名が設定されているか確認しましょう。

mail() do |format|
  format.html
  format.text
end

と設定されているとtext.erbも探しに行きます。

ModelのAssociationを1対nではなく1対1で設定したい場合

1つのレコードに対して複数の評価がある場合、モデルファイルには以下のように記載していると思います。

belongs_to :book
has_many :rates

それに対して1つのレコードに対して1つの評価のみにしたい場合は

belongs_to :book
has_one :rate

とhas_oneを使います。

複数ではなく単一なので複数形の(-s)も消しましょう。

 

HTMLのIDは上から探して一番最初に見つかったものだけを取得する。

javascriptで書き換えたいときによく使う

<div id="object">
var obj = document.getElementById('#object');

やjQueryの

var obj = $('#object');

を使うことがあると思います。

この時、1つのHTMLファイルに同じIDが複数ある場合、先頭から探していき一番最初に見つかったものだけを使います。

なので、複数の同一オブジェクトをそれぞれ取得したい場合は

<div id="object-<%=book.id%>">

とユニークになるようにIDを設定してあげましょう。

もちろん取得するjavascript側も

var obj = document.getElementById('#object-<%=book.id%>');

var obj = $('#object-<%=book.id%>');

と記載する必要があります。

コメント

タイトルとURLをコピーしました