我正在使用Ruby on Rails 3.2.9。我的模型类有一个link
属性,在将相关对象存储到数据库之前,我想在默认协议之前添加该值(一个URL,一种字符串)它不存在(示例协议可以是http://
,https://
,ftp://
,ftps://
等等;默认协议是http://
)。为了使我能够使用一些正则表达式来实现Rails回调,并且可能使用URI Ruby library,但是我在如何实现它时遇到了麻烦。
有什么想法吗?我该怎样/应该这样做?
答案 0 :(得分:1)
使用简单的正则表达式替换怎么样?
class String
def ensure_protocol
sub(%r[\A(?!http://)(?!https://)(?!ftp://)(?!ftps://)], "http://")
end
end
"http://foo".ensure_protocol # => "http://foo"
"https://foo".ensure_protocol # => "https://foo"
"ftp://foo".ensure_protocol # => "ftp://foo"
"ftps://foo".ensure_protocol # => "ftps://foo"
"foo".ensure_protocol # => "http://foo"
答案 1 :(得分:0)
您可能希望开始使用before_validation回调
class YourModel < ActiveRecord::Base
PROTOCOLS = ["http://", "https://", "ftp://", "ftps://"]
validates_format_of :website, :with => URI::regexp(%w(http https ftp ftps))
before_validation :ensure_link_protocol
def ensure_link_protocol
valid_protocols = ["http://", "https://", "ftp://", "ftps://"]
return if link.blank?
self.link = "http://#{link}" unless PROTOCOLS.any?{|p| link.start_with? p}
end
end