Rails验证从列表中排除部分字符串

时间:2014-05-29 13:47:14

标签: ruby-on-rails lambda validation

基本上我想验证提供的网址不包括yahoo,goolge,twitter或facebook,我真的想用内联lambda来完成这个。但是我做的每个测试都会引发错误,或者没有阻止列表中的单词。

我已尝试过以下各项......以及其他......

validates_exclusion_of :url, in: %w[twitter google facebook yahoo]

validates_exclusion_of :url, with: ->(link) {%w[twitter google facebook yahoo].all?{ |x| !!link[x] } }

validates_exclusion_of :url, in: ->(link) {%w[twitter google facebook yahoo].all?{ |x| !!link[x] } }

validates :url, exclusion: { in: %w[twitter google facebook yahoo]

validates ->(:url){ %w[twitter google facebook yahoo].any? {|y| !!:url[y]}.(:url)

validates :url, :with lambda { %w[twitter google facebook yahoo].any? { |y| !!:url[y] } }

validates :url, with: (not %w[twitter google facebook yahoo].any?{|y|if(:url.nil?)false;end;!!:url[y]})

validates :url, with: (not %w[twitter google facebook yahoo].any?{ |y| :url.nil? ? false : !!:url[y] })

validates :url, with: (not %w[twitter google facebook yahoo].any?{ |y| (not !!:url) ? false : !!:url[y] })

validates :url, with: (not %w[twitter google facebook yahoo].any?{ |y| !!defined?(:url) && not :url.nil? ? false : !!:url[y] })

validates :url, with: (not (%w[twitter google facebook yahoo]).any?{ |y| defined?(:url) ? false : :url[y] })

validates_with (not (%w[twitter google facebook yahoo]).any?{ |y| defined?(:url) ? false : :url[y] })

lambda和验证器帮助器可以用于什么?

4 个答案:

答案 0 :(得分:4)

您可以使用Regex

实现这一目标
validates_format_of :url, :with => /^((?!(google.com|yahoo.com|twitter.com|facebook.com)).)*$/

会抓住:

"www.mail.google.com"        --> catch
"www.mail.yahoo.com"         --> catch
"domain.twitter.com"         --> catch
"twitter.com"                --> catch
"www.twitter.com"            --> catch
"data.facebook.com"          --> catch
"www.firstfighterwing.com"   --> free

<强>阐释:

\A((?!(google.com|yahoo.com|twitter.com|facebook.com)).)*\z
|  ||           |                                    | |
|  ||           OR                                   | |
Beg||ning of line                                    | |
   ||                                                | |
   Look-ahead not (google.com|yahoo.com ...)         | |
                                                     Followed by any characters but \n 

答案 1 :(得分:1)

这应该有效

validates_exclusion_of :url, in: %w(twitter google facebook yahoo)

您已validates_exclusion_of :url, in: %w[twitter google facebook, yahoo]这是错误的,因为您在comma(,)的单词对中有wrong syntax

%w(twitter google facebook yahoo)
#=> ["twitter","google","facebook","yahoo"]

答案 2 :(得分:1)

使用标准验证帮助程序是不方便的,因为它们只允许您匹配一组固定的字符串,或者如果您使用validates_format_of测试它是否与正则表达式匹配。你需要测试它是否与正则表达式不匹配。 (你可以设置一个正则表达式来测试字符串是否包含任何值,但这对于正则表达式来说是尴尬和丑陋的 - 它& #39;使用正则表达式更好,更可读,测试字符串是否包含值)

我会为此使用自定义验证方法。

validate :url_does_not_contain_unwanted_string

def url_does_not_contain_unwanted_string
  if self.url =~ /twitter|google|facebook|yahoo/
    self.errors.add(:url, "contains a string which is not allowed")
  end
end

答案 3 :(得分:0)

可以使用

完成
validates_exclusion_of :url, in: ['twitter', 'google', 'yahoo', 'facebook']

希望这会有所帮助:)