2012-01-08 192 views
0

我試圖修改模型的after_validation回調模型中的屬性,但所有@attributes都返回nil,因此該方法失敗。after_validation塊中的模型訪問屬性

如何在保存之前,但在驗證之後訪問ActiveRecord的@attributes。 我正試圖從類中的方法訪問它。

class Business < ActiveRecord::Base 
      attr_accessible :latitude, :longitude 
      geocoded_by :address 
      after_validation :geocode 

      # Returns a human readable address from our various fields 
      def address 
       # All of these are nil when this gets called, from the geocode block which gets called by after_validation 
       [self.street + self.street2, self.city, self.state].compact.join(', ') 
      end 
    end   
+0

後一些代碼。 – 2012-01-08 20:59:34

+0

沒有太多的帖子,但肯定:) – 1dayitwillmake 2012-01-08 21:32:32

回答

1

在一個實例變量存儲應該工作:

after_validation {|x| @this = x; geocode} 

def address 
    [@this.street + @this.street2, @this.city, @this.state].compact.join(', ') 
end 
+0

你能詳細解釋一下這個答案(語義,這種方法背後的思考,爲什麼我的方法不起作用)? – 1dayitwillmake 2012-01-09 04:10:43

+0

我不確定你的方法不起作用。我測試了一個基本的after_validation實現,並在一個方法中調用了logger.debug(self.content),它的工作方式與您的預期相同。我唯一的猜測是,地理編碼正在做一些事情,防止這些屬性可見,但沒有看到我不確定的方法。這就是說,創建一個實例變量來保存內容,而不管地理編碼是在做什麼,並直接訪問它而不是直接在對象上的內容應該解決這個問題。 – josephrider 2012-01-09 04:46:23