【问题标题】:Simple calculation not working before save, Rails简单的计算在保存之前不起作用,Rails
【发布时间】:2018-02-02 20:06:52
【问题描述】:

我有一个base_price 字段、一个shipping_price 字段和一个total_price 字段。

这是一个简单的base_price 加上shipping_price 等于total_price。出于某种原因,我无法在保存模型时进行这个简单的计算。

这是我的代码:

item.rb

before_save :total_price_calculator

private

  def total_price_calculator
    self.total_price.to_i = self.base_price.to_i + self.shipping_price.to_i
  end

它无法进行计算并将其保存在数据库中,我并没有真正得到错误的原因。

【问题讨论】:

  • 你的代码减去所有to_i 方法对我来说效果很好。你能提供更多细节吗?

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5


【解决方案1】:

尝试以下方法

self.total_price它在分配给这个任意值整数时会自动保存整数,这就是为什么你不需要调用to_i

修改后

before_save :total_price_calculator

private

def total_price_calculator
    self.total_price = base_price.to_i + shipping_price.to_i
end

您不需要在base_priceshipping_price 上使用self,因为它们已经具有从表单给出的值。

或者你可以直接使用如下图

before_save {self.total_price = self.base_price.to_i + self.shipping_price.to_i}

希望对你有帮助

【讨论】:

    【解决方案2】:

    您在此处的作业上应用了一种方法,我怀疑这可能是问题,请像这样尝试:

    def total_price_calculator
      self.total_price = self.base_price + self.shipping_price
    end
    

    total_price 无论如何都会变成int

    【讨论】:

    • 不,不幸的是它仍然没有保存total_price
    • base_priceshipping_price 定义的字段使用什么类?
    • 三个都是整数。
    • 那么首先你不需要to_i 转换,因为它们已经是整数。您是否使用表单来传递这些值?
    • 您能否验证传递给这些属性的值是整数,以便它们具有值并且在分配发生时不为零?还有保存后total_price的值是多少
    【解决方案3】:

    尝试使用其他方法,例如 before_update/create/validate,插入断点也看看那里发生了什么,返回 false 以取消所有后续回调。

    也许这是相关的: Rails: How to use before_save to change a field value based on another field?

    【讨论】:

      【解决方案4】:

      试试

      def total_price_calculator
        self.total_price.to_i = self.base_price.to_i + self.shipping_price.to_i
        true
      end
      

      有时如果结果为 nil,则为您的验证返回 false,这将回滚记录而不是保存。

      或者进一步调试试试...

      def total_price_calculator
        puts self.base_price.to_i
        puts self.shipping_price.to_i
        puts self.base_price.to_i + self.shipping_price.to_i
        puts self.total_price.to_i = self.base_price.to_i + self.shipping_price.to_i
        self.total_price.to_i = self.base_price.to_i + self.shipping_price.to_i
        true
      end
      

      如果最后一个 puts 返回 false 或 nil,您的保存将无法通过验证并且不会保存。

      【讨论】:

        猜你喜欢
        • 2018-02-02
        • 2020-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多