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/