0

我在3個模型中使用了此方法,因此我想提取它並乾燥。我也遇到了attr默認值的問題。當字段爲空時,它將被評估爲空字符串""而不是nil,所以我必須在方法中寫入條件以避免將「http」添加到空字符串。Rails:對多個模型使用相同的自定義驗證方法

我應該在哪裏放置該方法,以及如何將它包含在模型中?

我應該優化該方法嗎?如果是這樣,我在哪裏以及如何將默認attr值設置爲nil(rails/db/both)?

before_validation :format_website 

def format_website 
    if website == "" 
    self.website = nil 
    elsif website.present? && !self.website[/^https?/] 
    self.website = "http://#{self.website}" 
    end 
end 

回答

2

你可以把你方法在應用程序/模型/顧慮文件夾,例如,作爲Validatable模塊(即validatable.rb):

module Concerns::Validatable 
    extend ActiveSupport::Concern 

    def format_website 
    if website.blank? 
     self.website = nil 
    elsif !self.website[/^https?/] 
     self.website = "http://#{self.website}" 
    end 
    end 

end 

然後將其包含在每個模型爲

include Concerns::Validatable 
+0

potashin,然後只需從'before_validation:format_website'調用每個模型? –

+0

@SzilardMagyar:是的 – potashin

+0

potashin,讓我再問一個問題。這種方法是否足夠好,或者我應該用這個'nil'和'''''問題做點什麼? –