2015-09-07 61 views
9

目前通過表單上我的Rails應用程序添加一個網址,當我們有以下before_savevalidation檢查:驗證過程中添加WWW網站的URL

def smart_add_url_protocol 
    if self.website? 
    unless self.website[/\Ahttp:\/\//] || self.website[/\Ahttps:\/\//] 
     self.website = "http://#{self.website}" 
    end 
    end 
end 

validates_format_of :website, :with => /^((http|https):\/\/)?[a-z0-9]+([-.]{1}[a-z0-9]+).[a-z]{2,5}(:[0-9]{1,5})?(\/.)?$/ix, :multiline => true 

然而,這是什麼意思是,如果我鍵入到表單字段

testing.com 

它告訴我,該網址是無效的,我不得不把在

www.testing.com 

它接受的網址

我希望它接受url是否用戶輸入www或http。

我是否應該向smart_add_url_protocol添加其他內容以確保添加該內容,或者這是驗證問題?

由於

回答

9

有可用於檢查url秒的標準URI類。在你的情況下,你需要URI::regexp方法。使用它你的班級可以這樣重寫:

before_validation :smart_url_correction 
validate :website, :website_validation 

def smart_url_correction 
    if self.website.present? 
    self.website = self.website.strip.downcase 
    self.website = "http://#{self.website}" unless self.website =~ /^(http|https)/ 
    end 
end 

def website_validation 
    if self.website.present? 
    unless self.website =~ URI.regexp(['http','https']) 
     self.errors.add(:website, 'illegal format') 
    end 
    end 
end 
+0

感謝 - 根據您的建議更改了代碼,但它仍然告訴我,該網站是無效的,沒有www部分。我是否也需要改變這一行的內容? validates_format_of:website,:with =>/^((http | https):\/\ /)?[a-z0-9] +([ - 。] {1} [a-z0-9] +)。[ az] {2,5}(:[0-9] {1,5})?(\ /。)?$/ix,:multiline => true – tessad

+0

刪除此驗證。上面的代碼不需要它。 – dimakura