2013-06-12 149 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