2012-09-30
RailsのアソシエーションまわりでNoMethodErrorが起こった時に思い出したいこと
1週間くらい前にも全く同じ所で30分くらい詰まっていたのに、また同じ所で15分くらい詰まっていたので自分用にメモをしておく。
- 外部キーの設定もしっかりやった
- モデルへのリレーションの設定もやった
「これでアソシエーションの設定は整った」と思いきや、いざ動かしてみると NoMethodError が起こった。
以下モデルとビューのソースコードの抜粋。
# モデル
@mails = mail.all
#ビュー
<% @mails.each do |mail| %>
<%= mail.attachment.filename %>
<% end %>
原因は、#each でぶん回してる全ての mail オブジェクトに attachment がついているとは限らないためだった。
nil になる可能性があるものに対してメソッド呼び出しをする際には、呼び出す前に確認をしなければならない。
以下のように書きなおせば OK。ただし、nil の場合には何も出力されないので注意。
<% @mails.each do |mail| %>
<%= mail.attachment.filename if mail.attachment.filename.present? %>
<% end %>
※参考
『Rails での実装で気をつけたい3つの罠』http://www.katawara.com/2009/rails_trap/(※ 現在はリンク切れ)