0

我試圖在Ruby on Rails中創建一個可以擴展的自定義驗證器類。但是,我無法使用子類和超級類的驗證。 這個例子會澄清什麼,我想實現:繼承自定義驗證器Ruby on Rails

特級

class NameValidator < ActiveModel::EachValidator 
    def validate_each (record, attribute, value) 

     #Checks to see if the incoming string is free of any numerical characters 
     if value.match(/\A[+-]?\d+\Z/) 
     record.errors[attribute] << "String must contain no numerical characters" 
     end 
    end 
end 

子類

class SevenNameValidator < NameValidator 

    def validate_each (record, attribute, value) 

     # Checks and only allows 7 character strings to be validated 
     if value.length != 7 
      record.errors[attribute] << "String must be 7 characters exactly" 
     end 
    end 
end 

Model類

class User < ActiveRecord::Base 
    attr_accessible :firstname 

    validates :firstname, :seven_name => true 

end 

所以如果字符串「你好「測試結果錯誤=>」字符串必須準確地爲7個字符「

但是,如果測試字符串「hello77」,它將被驗證成功。

它不應該首先從NameValidator中檢查並看到它有數字嗎?如果沒有,我怎麼能繼承工作在自定義驗證器?我是否需要在我的驗證器類中使用方法?一個例子,將不勝感激,我搜查了很多,但我找不到自定義驗證器的例子。

+2

您可能想在'SevenNameValidator'的validate_each中使用'super'。 – oldergod

回答

1

呼叫super在子類:

class SevenNameValidator < NameValidator 

    def validate_each (record, attribute, value) 

     # Checks and only allows 7 character strings to be validated 
     if value.length != 7 
      record.errors[attribute] << "String must be 7 characters exactly" 
     else 
      #call super to trigger super class method 
      super 
     end 
    end 
end 
1

我認爲它可能與你的正則表達式的問題。如果你試圖將任何字符串與數字匹配,你現在應該有類似/\A\D*\d+\D*\z/的東西,那麼你就匹配了大量我認爲不需要的東西。