【问题标题】:after_save error in ruby on railsruby on rails中的after_save错误
【发布时间】:2012-08-10 04:02:39
【问题描述】:

我有两个相互链接的模型,我正在尝试做一个 after_save,在模型中创建,代码如下。

class CustomerBill < ActiveRecord::Base
  after_save :updating_and_creating_ledger_items
  has_many :customer_ledgers, :dependent => :destroy

  def updating_and_creating_ledger_items
    CustomerLedger.create(:date => self.date, :customer_id => self.customer_id, :user_id => self.user_id)
  end
end

客户分类帐模型

class CustomerLedger < ActiveRecord::Base
  belongs_to :customer_bill,  :foreign_key => "customer_bill_id"
end

现在的问题是程序执行完美,但值没有放入数据库。如果我检查客户分类帐,它仍然是空的。

值没有被存储。似乎是什么问题?对此事的指导会有所帮助。

提前致谢。 :)

【问题讨论】:

  • 尝试将创建更改为创建!让我知道会发生什么
  • 当我创建的时候!表单没有被保存,它去编辑,我收到了我提交的错误,因为找不到 CustomerBill with id=30
  • 现在我添加了 :customer_bill_id => self.id 并且表单没有得到保存..!!

标签: ruby-on-rails ruby-on-rails-3 activerecord model


【解决方案1】:

添加

  validates_associated :customer_ledgers

在 customer_bill.rb 中

试试

ledger = customer_ledgers.build(:date => self.date, :customer_id => self.customer_id, :user_id => self.user_id)
ledger.save

为避免验证而编辑,使用

ledger = customer_ledgers.build(:date => self.date, :customer_id => self.customer_id, :user_id => self.user_id)
ledger.save(:validate => false)

【讨论】:

  • 我试过了。代码正在正确执行,但分类帐表仍然是空的.. :( :( 没有得到似乎是什么问题。
  • 很好奇,为什么要将 date, customer_id, user_id 存储在 CustomerLedger 中,而您已经将其保存在 CustomerBill 中并且您在这两者之间有关联?
  • 实际上这是一个复杂的代码,我在其中计算和存储账单总额和到期金额等等……但为了确定问题,我剥离了代码……只留下一行创建选项。并且关联的账本属于票据,票据有很多账本。现在我添加了相关的验证。
  • 那么,您在 CustomerLedger 中有任何验证吗?可能 b 验证没有通过,所以它没有被保存。试试 ledger.save(:validate => false)
  • @Salil- 一百万谢谢....验证导致了问题...只需更新您的答案,以便其他人知道... :)
【解决方案2】:

CustomerLedger 可能未通过验证检查。替换:

def updating_and_creating_ledger_items
  CustomerLedger.create(:date => self.date, :customer_id => self.customer_id, :user_id => self.user_id)
end

与:

def updating_and_creating_ledger_items
  ledger = customer_ledgers.build(:date => self.date, :customer_id => self.customer_id, :user_id => self.user_id)
  ledger.save(:validate => false)
end

【讨论】:

  • 谢谢迈克...我错过了验证错误选项...因此我得到了问题...现在它工作正常。 :)
【解决方案3】:

您没有在create 中设置customer_bill_id,请将create 更改为build

customer_ledger.build(:date => self.date, :customer_id => self.customer_id, :user_id => self.user_id)

【讨论】:

  • 我收到以下错误undefined method `build' for #<0x38c7d98>
猜你喜欢
  • 1970-01-01
  • 2017-06-15
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多