2010-11-23 38 views

回答

3

您可以覆蓋setter方法的鏈接。在你的模型中,如下所示:

def link=(str) 
    str = 'http://' + str if str[0,7] != 'http://' 
    super(str) 
end 

這將強制將http://添加到所有鏈接的開頭(如果尚未存在)。

2

您可以使用自定義驗證。

假裝你的模式是「郵報」的屬性爲「URL」,您可以使用類似:

class Post < ActiveRecord::Base 
    validate :ensure_valid_url 

    protected 

    def ensure_valid_url 
    protocol_regexp = %r{ 
     \A 
     (https?://) 
     .* 
     \Z 
    }iux 

    self.url = "http://" + url unless url.blank? or url.match(protocol_regexp) 

    ipv4_part = /\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]/ # 0-255 
    regexp = %r{ 
     \A 
     https?:// 
     ([^\s:@]+:[^\s:@]*@)? 
     ((xn--)?[[:alnum:]\w_]+([-.][[:alnum:]\w_]+)*\.[a-z]{2,6}\.? | 
      #{ipv4_part}(\.#{ipv4_part}){3}) 
     (:\d{1,5})? 
     ([/?]\S*)? 
     \Z 
    }iux 

    default_message  = 'does not appear to be a valid URL' 
    default_message_url = 'does not appear to be valid' 
    options = { :allow_nil => false, 
       :allow_blank => false, 
       :with => regexp } 

    message = url.to_s.match(/(_|\b)URL(_|\b)/i) ? default_message_url : default_message 
    validates_format_of(:url, { :message => message }.merge(options)) 
    end 

end 

這個例子是基於validates_url_format_of

0

史蒂夫·Lorek的回答在這方面採取一些鏈接提交的用戶將包含HTTPS賬戶變動://而不是http://

def link=(str) 
    str = 'http://' + str if (str[0,7] != 'http://' && str[0,8] != 'https://') 
    super(str) 
end