Rails 3 вручную создает модель и постоянно не работает - PullRequest
0 голосов
/ 09 февраля 2011

Таким образом, у меня есть объект модели, который должен вставить упаковочные листы, если модель сохранена (рассматриваемая модель предназначена для оплаты).

Я попытался сделать это в хуке after_save для модели Payment, но на самом деле он не сохранил упаковочные листы. Я перенес это на контроллер в блоке if @ payment.save, но он по-прежнему не сохраняется в моделях. Код ниже:

  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 !@order.has_membership?

Обратите внимание, что MembershipMailer стреляет, так что я знаю, что он там, но эти упаковочные листы не будут сохраняться. Я пытаюсь повторить эту функцию вручную в консоли, и она отлично работает. Не уверен, что мешает. У меня нет проверок в модели PackingSlip на данный момент.

1 Ответ

1 голос
/ 09 февраля 2011

Когда вы говорите, что оно не сохраняется, вы имеете в виду, что ассоциации нет или что она не сохраняется в базе данных?

Один из вариантов (как упоминал Брайан выше) - добавить нескольковедение журнала отладки, чтобы точно увидеть, что происходит.Я взял на себя смелость сделать рефакторинг своего кода более похожим на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...