2013-06-12 89 views
0

我有兩個類,一個父類和一個子類,簡化如下。多次設置回調中設置的實例變量

class Parent < ActiveRecord::Base 
    has_one :child 
    accepts_nested_attributes_for :child 

    validates :child, :presence => true 
    validates_associated :child 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 

    attr_accessible :third_party_attribute 

    before_validation :set_attributes 
    validates :parent, :presence => true 
    validates :third_party_attribute, :presence => true 

    def set_attributes 
    if self.third_party_attribute.nil? 
     self.third_party_attribute = <MAKE THIRD PARTY FUNCTION CALL> 
    end 
    end 
end 

當我通過在屬性(包括子屬性),並保存Parent模型實例,我看到我的孩子驗證正在爲運行兩次(一次驗證/保存那個孩子,有一次在父模型中調用validates_associated)。這部分是有道理的。

問題是,在這兩個驗證調用中,我的第三方函數調用正在觸發。這就像我第一次通過驗證設置屬性,但第二次通過驗證時,對象無法識別其屬性已被設置。令人沮喪的是,有一個真正的美元成本與調用這個第三方服務相關,所以我無法真正地重複調用。

我該如何解決這個問題,以便第三方調用只進行一次,無論對象在保存之前進行了多少次驗證?

+0

有可能是在你的控制器來解決此問題的方法...你能張貼有關你的控制器操作代碼? – zeantsoi

+0

此時沒有控制器操作。錯誤發生在保存在控制檯的參數中。 – Bryce

+0

你在控制檯上具體運行什麼? – zeantsoi

回答

0

試試這個

def set_attributes 
    if third_party_attribute.nil? 
    self.third_party_attribute = <MAKE THIRD PARTY FUNCTION CALL> 
    end 
end 

注意,條件是if third_party_attribute.nil?代替self.third_party_attribute.nil?

參考this

+0

這已經包含在問題中了嗎?目前還不清楚它是如何回答的。你應該嘗試並提供一兩句解釋性說明。 –

+0

我已經有了。問題是在保存之前,每次驗證都會將'third_party_attribute'或'self.third_party_attribute'評估爲零。 – Bryce

+0

我試過了,沒有'self'參考 - 最終結果是一樣的。 – Bryce