before_save回调时的NoMethodError

时间:2017-11-26 21:03:20

标签: ruby-on-rails ruby

我在提交创建对象和嵌套对象的表单时收到此错误消息:

NoMethodError (undefined method `ratio' for nil:NilClass):

app/models/sale.rb:57:in `set_total_valuation'
app/controllers/api/v1/sales_controller.rb:19:in `create'

这是我的模特

class Sale < ApplicationRecord
    belongs_to :user
    has_many :distribution_entries, dependent: :destroy

    accepts_nested_attributes_for :distribution_entries, reject_if: :all_blank, allow_destroy: true

    validates :name, presence: true, uniqueness: true

  before_save :set_total_valuation

  private

  def set_total_valuation
    main_ratio = self.distribution_entries.find { |object| object["item"] == "Main" }.ratio / 100
    self.total_valuation = self.target / main_ratio
  end
end

我认为我得到的是因为在创建周期的这个阶段不存在distribution_entries,但播种时效果很好。

1 个答案:

答案 0 :(得分:0)

在这种情况下,如果它看似合理并且可能会出现销售中没有分销条目的情况,那么您可以为回调添加条件并使用其他方法或过程检查distribution_entries.present?http://guides.rubyonrails.org/active_record_callbacks.html#using-if-and-unless-with-a-proc):

before_save :set_total_valuation if: Proc.new { |sale| sale.distribution_entries.present? }