0

我有一个类链接。该类具有这些属性

  1. 推特
  2. Facebook
  3. Pinterest
  4. 知乎

我想编写一个验证,以确保当用户将链接插入文本框时,它以 http 或 https 开头。

验证有效,但是当用户根本不插入链接时我遇到了一个问题。它仍然尝试对空属性运行验证并引发错误。下面的代码是我检查空属性的尝试。

这是我的验证:

     class Links <  ActiveRecord::Base
     attr_accessible :facebook, :twitter, :quora, :pinterest

     validate :formatted_link

     def formatted_link
      links = %w(facebook twitter pinterest quora)
       if links.any? {|link| self[link].nil?}
         #Don't want it to do any validation if column is nil. 
         #Would like to drop column if user doesn't add a link.
       else
          validates_format_of links, :with => URI::regexp(%w(http https))
          errors.add(:base, "Your link must start with http or https.")
       end
    end

原因:

如果用户只是提交“www.twitter.com/username”,则 url 会附加到我的网站 url“mydomain.com/page/www.twitter.com/username”。不知道为什么会这样。如果还有别的我可以做些什么来防止这种情况或我想念的东西,请告诉我。

谢谢。

4

2 回答 2

1

我认为您需要先将其转换links为符号,然后再将其传递给validates_format_of,但是由于它似乎对您有用,因此我可能错了,或者您上面的示例代码可能缺少该细节。

无论哪种方式,您都可以通过以下方式跳过对空白的验证:

validates_format_of :foo, with: some_format, allow_blank: true
于 2013-04-25T00:05:41.123 回答
0

我认为您正在尝试以迂回的方式进行条件验证。因为你真的只想允许空白,你可以这样做:

class Link < ActiveRecord::Base
  Networks = [:facebook, :twitter, :quora, :pinterest]
  attr_accessible *Networks

  validates_format_of *Networks, :with => URI::regexp(%w(http https)), :allow_blank => true
end
于 2013-04-25T02:49:18.497 回答