2011-04-10 31 views
2

我有這個ruby類的鏈接數組。現在,即使數組包含的鏈接不是有效的URL,我仍可以保存Paper對象。我有一個方法遍歷數組並驗證url,如果url無效,則返回false。但是當我嘗試調用Paper.save時,我想獲得一條錯誤消息。那可能嗎?MongoMapper自定義驗證

class Paper 
    include MongoMapper::Document 

    key :links,  Array 

    validates_presence_of :links 

    def validate_urls 
    reg = /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$/ix 
    status = [] 
    links.each do |link| 
     if link.match(reg) 
     status.push('true') 
     else 
     if "http://#{link}".match(reg) 
      status.push('true') 
     else 
      status.push('false') 
     end 
     end 
    end 
    if status.include?('false') 
     return false 
    else 
     return true 
    end 
    end 

end 
+0

你嘗試'validate_on_create'? – 2011-04-10 11:08:19

回答

5

如果您使用從GitHub MongoMapper(其中加載ActiveModel支持),見http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validate

class Paper 
    include MongoMapper::Document 

    key :links,  Array 

    validates_presence_of :links 
    validate :validate_urls 

    def validate_urls 
    reg = /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$/ix 
    status = [] 
    links.each do |link| 
     if link.match(reg) 
     status.push('true') 
     else 
     if "http://#{link}".match(reg) 
      status.push('true') 
     else 
      status.push('false') 
     end 
     end 
    end 
    if status.include?('false') 

     # add errors to make the save fail 
     errors.add :links, 'must all be valid urls' 

    end 
    end 

end 

不知道這代碼,是用0.8.6寶石,但它可能。

而且,它不適用於這種情況,但如果它不是一個數組,你可以粉碎一切轉化爲一個單行:

key :link, String, :format => /your regex here/ 
+0

它似乎不適用於我擁有的寶石。雖然我不會嘗試從源代碼創建寶石。 – schwift 2011-04-12 22:10:02

+0

啊哈 - 在'errors.add'之前擺脫'return false'幫助很大。 – schwift 2011-04-13 17:11:36