格式的自定义验证

时间:2013-04-24 21:42:06

标签: ruby-on-rails ruby custom-validators

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

  1. 微博
  2. Pinterest的
  3. Quora的
  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 get附加到我的网站url“mydomain.com/page/www.twitter.com/username。不确定为什么会发生这种情况。如果有我可以做的其他事情来防止这个或我想念的东西请告诉我。

    感谢。

2 个答案:

答案 0 :(得分:1)

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

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

validates_format_of :foo, with: some_format, allow_blank: true

答案 1 :(得分:0)

我认为你试图以迂回的方式做conditional validation。既然你真的只想允许空白,你就可以这样做:

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