2011-02-09 12 views
0

モデルが保存されている場合(モデルは支払い用です)、梱包伝票を挿入する必要があるモデルオブジェクトがあります。Rails 3が手動でモデルを作成しても動作しないのです

これは、支払いモデルのafter_saveフックでこれを実行しようとしましたが、実際には梱包伝票を保持しませんでした。私はif @ payment.save blah blahブロックのコントローラーに移動しましたが、それでもモデルは保持されません。以下のコードは次のとおりです。

if @payment.save 

    if @payment.order.has_physical_product? 
     # generate packing slip for shipping 
     slip = PackingSlip.new(:payment_id => @payment.id, :department => "Shipping") 
     slip.save! 

     if @payment.order.has_book? 
     slip = PackingSlip.new(:payment_id => @payment.id, :department => "Royalty") 
     slip.save! 
     end 

    end 

    MembershipMailer.membership_email(@order) unless [email protected]_membership? 

注MembershipMailerので、私はそれがそこに知っているが、これらの梱包伝票が保持されません発射されていること。私はコンソールでこの機能を手作業で複製しようとするとうまくいきます。何がそれを停止しているか分からない。私は現時点でPackingSlipモデルの検証は行っていません。

+0

いくつかのログを入れました。最も明白なことは、 '@pay.order.has_physical_product?'が 'false'を返すことです。 –

+0

私はコンソールでその注文を出し、has_physical_productを発行しますか?コマンドはtrueを返します:( – MattC

答えて

1

あなたはそれが永続的ではないと言うとき、その関連がそこにないか、それがデータベースに保存されていないことを意味しますか?

1つのオプション(前述のBrian)は、何が起こっているかを正確に見るためにデバッグログを追加することです。私はあなたのコードをリファクタリングする自由をより多くのRailsのようにしました(payment has_many :packing_slipsと仮定します):

class Payment < ActiveRecord::Base 
    has_many :packing_slips 
    after_save :generate_packing_slips 

    def generate_packing_slips 
    if order.has_physical_product? 
     packing_slips.create(:department => "Shipping") 
     packing_slips.create(:department => "Royalty") if order.has_book? 
    end 

    # At this point, the packing_slips collection should be 
    # populated - valid or not, so we can check what's going on. 
    # If you're not getting any output here, the packing slips 
    # aren't even being generated, which means there's a problem 
    # with order.has_physical_product? 

    if Rails.env.development? 
     packing_slips.each do |ps| 
     Rails.logger.debug("Error Messages: #{ps.errors.full_messages.inspect}") unless ps.valid? 
     end 
    end 

    # btw, `unless !foo` is the same as `if foo` 
    MembershipMailer.membership_email(order) if order.has_membership? 
    end 
end 
関連する問題