如果没有默认协议,如何使用默认协议添加URL?

时间:2012-12-26 15:42:14

标签: ruby-on-rails ruby regex ruby-on-rails-3 url

我正在使用Ruby on Rails 3.2.9。我的模型类有一个link属性,在将相关对象存储到数据库之前,我想在默认协议之前添加该值(一个URL,一种字符串)它不存在(示例协议可以是http://https://ftp://ftps://等等;默认协议是http://)。为了使我能够使用一些正则表达式来实现Rails回调,并且可能使用URI Ruby library,但是我在如何实现它时遇到了麻烦。

有什么想法吗?我该怎样/应该这样做?

2 个答案:

答案 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