2010-11-29 6 views
0

これは非常に混乱しやすい状況です。私が「新しい」コントローラに入っているからです。コンソールが(正しく)Railsに1つしか表示しないと、デバッグで2つのレコードが表示されるのはなぜですか?

私は、次のビューを使用して新しい電子メールレコード:

<% title "New Email" %> 

<div id = "form"> 
    <%= render :partial => 'form' %> 
</div> 

<div id = "tabs"> 
    <h2>Campaign Activity</h2> 
    <%= debug @campaign %> 

</div> 

メールはキャンペーンIDでネストされた作成されます。

コンソールから、campaign.emailsに正しいメールが1件だけ表示されます。

しかし、ディスプレイ2つの電子メールの記録上のデバッグ@campaignライン、次のような二ルックス:

def new 
    @campaign = Campaign.find(params[:campaign_id]) 
    @email = @campaign.emails.build 
    end 

- &id001 !ruby/object:Email 
    attributes: 
    created_at: 
    title: 
    campaign_id: 1 
    updated_at: 
    days: 
    subject: 
    message: 
    attributes_cache: {} 

    changed_attributes: 
    campaign_id: 
    errors: !ruby/object:ActiveRecord::Errors 
    base: *id001 
    errors: !map:ActiveSupport::OrderedHash {} 

私は標準の新しいコントローラを持っている新しいビューにしています

質問:ビューから、キャンペーンの関連するメールを正しく取得するにはどうすればよいのですか?「ファンタム」レコードが表示されるのはなぜですか?

+0

ような何かはい、それはだ - それはあなたの「ファントム」レコードです。それらをより簡単に/効率的に反復するには、ビルドを呼び出す前に、電子メールをコントローラのインスタンス変数に割り当てます。つまり、@emails = @ campaign.emailsは、ビューのループで@emailsをオーバーします。 – jenjenut233

+0

私は見る...私はビューにそれを追加する必要がありますので、私は@ campaign.emails.sortを適用して、<=>bを比較するときにファントムのメールでエラーを出力します – Angela

答えて

0

念私が正しく理解させるために:あなたの@campaignは、新しい(空の)電子メールを追加し、あなたが以外のすべての電子メールを反復処理することができるようにしたいあなたは@campaign.emails.buildを実行して、新しいアクションで1つの電子メールの記録を、持っています新しく作成されたもの?あなたはcampaign.emails.build @呼んでいるので、「新しい」ものを示し、すべての電子メールを反復処理していないために

は、

<div id = "tabs"> 
    <h2>Campaign Activity</h2> 
    <% @campaign.emails.reject {|x| x.new_record?}.sort{|x,y| x <=> y}.each do |email| %> 
     ... show the data of the email here ... 
    <% end %> 
</div> 
+0

まあ、見てみましょう@ campaign.emailsに.sortメソッドが適用されているためです。 – Angela

+0

これを処理するコードを編集しました。 – nathanvda