【问题标题】:record not saving when before_save action is called调用 before_save 操作时记录不保存
【发布时间】:2016-09-16 21:15:32
【问题描述】:

无法弄清楚..不知道为什么没有保存记录..该方法被正确调用,所有字段都存在,逻辑正确..这是我的模型代码:

class Mine < ActiveRecord::Base
belongs_to :shop
validates :merchant_id, presence: true
validates :auth_token, presence: true
before_save :assign_three_speed


private

  def assign_three_speed
    if CreateFulfillmentService::NON_US_MARKETPLACES.include?
    (self.marketplace)
      self.three_speed = false
    else
      self.three_speed = true     
    end
  end
end

嗯,这太疯狂了..我放了一些记录器,现在它确实保存了??这是我现在的代码:

  def assign_three_speed
    Rails.logger.info "What is self?? #{self.inspect}"
    if CreateFulfillmentService::NON_US_MARKETPLACES.include?
     (self.marketplace)
      self.three_speed = false
    else
      self.three_speed = true     
    end
    Rails.logger.info "Now what is self?? #{self.inspect}"
  end

【问题讨论】:

    标签: ruby-on-rails activerecord model


    【解决方案1】:

    在 5.0.0 之前的 Rails 版本中,从回调方法返回 false 将取消保存。来自 Rails 4.2.7 文档:

    如果 before_* 回调返回 false,则所有后面的回调和 相关动作被取消。回调通常在 它们被定义的顺序,除了回调定义为 模型上的方法,最后调用。

    设置self.three_speed = false时,是方法中运行的最后一条语句,所以false就是assign_three_speed方法的返回值。这就是为什么将记录器添加到最后一行修复它的原因。让该方法返回一些其他值。

    如果您不想取消回调,则返回 true 作为最后一行:

    def assign_three_speed
      if CreateFulfillmentService::NON_US_MARKETPLACES.include(self.marketplace)
        self.three_speed = false
      else
        self.three_speed = true     
      end
    
      true
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多