2012-08-07 57 views
3

我們的ActiveRecord模型具有許多不幸使用網絡的驗證。例如,它使用Facebook API來驗證給定的Facebook ID屬性。我希望將這些驗證移出模型,以便它們僅在特定上下文中運行,而不是在Factory Girl在測試中創建時運行。它還需要以ActiveAdmin兼容的方式完成。將驗證回調添加到Ruby on Rails中的ActiveRecord實例

我的想法是將方法提取到模塊,並讓該模塊適當擴展AR實例。

module ArtistConnectionValidations 
    def self.inject_to(record) 
    record.extend self 
    record.class_eval do 
     before_validation :validate_facebook_name 
    end 
    end 

    def validate_facebook_name 
    # Contact Facebook API 
    end 
end 

在ActiveAdmin它採用繼承的資源:

controller do # Executes in controller context 
    def resource 
    ArtistConnectionValidations.inject_to(Artist.find(params[:id])) 
    end 
end 

不幸的是,他們被添加到實例單類和#valid?方法回調看不出來這些驗證不會被調用。各種其他策略導致它被添加到基類中,感染整個系統。有任何想法嗎?

回答

0

我不確定這是否適合您。 但爲什麼不創建一個子類?

如果我正確理解你在這裏需要的東西,我認爲它會使代碼和使用更清晰。

#artist.rb 
class Artist < ActiveRecord::Base 
end 

#artist_with_validations.rb 
class ArtistWithValidations < Artist 
    before_validation :validate_facebook_name 

    def validate_facebook_name 
    # Contact Facebook API 
    end 
end 

然後,您可以使用兩個模型之一,具體取決於您是否希望用戶有或沒有驗證。

+0

這是一個合理的解決方案,除了語義問題,可能會滿足大多數用例。我想當時我希望有一個通用的解決方案,因爲我有不同類型的對象可以使用相同的驗證。 – 2013-10-09 15:26:07