2010-11-22 5 views
0

2つのモデル(注文とステータス)の基本的な多対多の関係があります。これらのモデルには、次のようになります。"新しいインスタンスを作成するときに` name 'for nil:NilClass "が返される

class Order < ActiveRecord::Base 
    has_many :products, :through => :lines 
    has_and_belongs_to_many :statuses 

    default_scope order("#{table_name}.created_at desc") 
end 

class Status < ActiveRecord::Base 
    has_and_belongs_to_many :orders 

end 

受注のための私のインデックスビュー内では、私は、しかし、注文の最新のステータスを表示し、そうorder.statuses.last.nameよ新しい注文を作成すると、エラーが発生します。このエラーは、未定義のメソッド名であり、新しいオーダーは最初に作成されたときに関係がないためです。

私の質問は、新しい注文を保存する前に、私の2つのモデル間の関係を初期化する方法はありますか?私は自分の注文が常に少なくとも自分のステータスコレクションの最初のステータスを持つことを望むが、保存する前に手動でチェックする必要はない。良い対策のための

エラーがある:私の見解では、この行の

undefined method `name' for nil:NilClass 

:すべて

<td><%= order.statuses.last.name %></td> 

感謝。

+0

まあ、 'statuses'を初期化するために、あなたはそれをハードコードするか、データベースにヒットする必要があります。それでは保存してから移動してみませんか?ステータスの配列をキャッシュして、そのように注文を初期化しない限り。 – Jeremy

答えて

0

<td><%= order.statuses.last.try(:name) %></td> 
1

簡単な修正:そこには最後の状態ではないか、最後のステータスに名前がない場合、これは注意する必要があり

<td><%= order.statuses.last.name if order.statuses %></td> 
+0

ありがとうございました。私の特定の状況のた​​めにこれを再生、ミックスの結果があります。私は正常に次を行うことができます:​​<%= order.statuses.last if order.statuses%> - しかし、私は​​<%= order.statuses.last.name if order.statuses%>を行うことはできません。私の推測では、これは.nameメソッドが自分のステータスモデルから来ているからです。これがnilであれば、応答する方法はまだ分かりません。この.nameメソッドを保存する前に、関係を初期化する必要があると思いますか?もう一度、ありがとう、私は本当に助けに感謝します。 – Kombo

+0

ステータスが名前なしで存在する可能性がありますか?その場合、あなたの状態に含めることができます: 'order.statuses.last.name if order.statuses.last.name' –

関連する問題