2016-09-16 60 views
2

不能確定記錄沒有被保存..爲什麼記錄沒有被保存..該方法被正確調用,並且所有字段都存在,並且邏輯正確..這是我的型號代碼:當調用before_save動作時記錄不保存

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 

回答

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