rails回调未得到执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rails回调未得到执行相关的知识,希望对你有一定的参考价值。

在我的一生中,我试图找出为什么我的回调没有得到执行sometimes(由于大多数情况下它都是开箱即用的,您在有时听到的没错)

我只有两个模型之间的父/子关系

在创建子记录时,我在after_create回调中所做的全部是更新(在父字段中累积所有子数量,以避免在运行时进行繁琐的查询)父表/模型记录中的数量字段

父模型(Payout

子模型为(Sales Transaction

Payout has_many SalesTransactions如上所述,在创建销售交易时,我正在更新(准确地说是增加)父记录(支付记录)的amount字段,以避免在运行时间。

所以支出amount field就是该支出sales_transactions的所有金额之和

和payout.amount一样好(执行回调后)

payout.amount == payout.sales_transactions.pluck('amount').sum

以及我尝试使用回调实现的目标

class SalesTransaction < ActiveRecord::Base
   belongs_to :payout
   after_create :update_payout_for_sale

   def update_payout_for_sale
    sales_amount = payout.amount || 0
    sales_amount =  sales_amount + amount.to_f
    ## Also make note of the minus from original amount i.e refund and custom_deduction_amount
    payout.update_attributes(:amount => sales_amount)
  end  

end

class Payout < ActiveRecord::Base
  has_many :sales_transactions
  has_one :referrer
  after_save :update_referrer_earning

  def update_referrer_earning
    referrer.update_attributes(:amount  => (amount*10)/100.to_d)) rescue nil
  end
end

这里有趣的部分是,当SalesTransaction为sometime时,created只是未调用回调,因为我看不到in支出记录的更新值

我现在正在尝试避免回调,但是为了知道why回调未得到执行,所以led me会问这个问题

注意

  1. SalesTransaction和Payout表上都没有验证(我已经检查了1000次)Payout.validators=> []

    SalesTransaction.validators => []

  2. 没有重量分配问题,因为我没有定义attr_accessibleattr_protected(我也对此进行了检查,并说它在大多数情况下都可以工作,而使用重量分配警告则不会这样)] >

  3. SalesTransaction记录一直在创建,只有付款记录没有更新(sometime)]]

  4. 我已经从sales_transactionspayouts中删除了大多数不需要的(在这里)关联为了简化代码

  5. 在两个型号上都没有像accepts_nested_attributes_for这样的东西

  6. 未附加动态验证,额外,额外

  7. 最近在这里,我正在尝试创建SalesTransaction

      options =  {"performer_id"=>177, "customer_id"=>35526, "sale_type"=>"sale", "show_id"=>502, "performer_percentage"=>BigDecimal.new("40.0"), "show_duration"=>4104, "gross_credits"=>3754, "gross_sales"=>BigDecimal.new("375.4"), "amount"=>BigDecimal.new("150.16"), "affiliate_id"=>nil, "affiliate_earning"=>BigDecimal.new("0.0"), "total_profit"=>BigDecimal.new("225.24"), "payout_period_id"=>89,"payout_id"=>4156, "stream_connection_id"=>540572, "history_id"=>44575, "credits"=>{:when_show_started=>350, :purchased_during_show=>{:free=>[], :paid=>[]}, :total_consumed=>{:free=>350, :paid=>3754}}, "sliding_scale_recalculations_done"=>false, "paid_minutes"=>62.57}
    

SalesTransaction.create(options)

在我的一生中,我试图找出为什么有时我的回调没有得到执行的原因(您有时听到的是正确的,因为大多数情况下它都是开箱即用的)。我所拥有的只是父母/子女关系...

] >

我想发表评论以回应Viren。尝试SalesTransaction.create!(带有感叹号)。然后,您是否始终看到质量分配错误?

尝试after_save而不是after_create。

答案

我想发表评论以回应Viren。尝试SalesTransaction.create!(带有感叹号)。然后,您是否始终看到质量分配错误?

另一答案

尝试after_save而不是after_create。

以上是关于rails回调未得到执行的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?

试图找出 Ruby on Rails 远程:真正的回调

未调用 Rails 应用程序上的 Paypal IPN

当活动被破坏但我必须继续执行片段中的代码时该怎么办?

使用链接访问页面时,Rails JavaScript 代码未执行

d3.json() 回调中的代码未执行