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/