基本上我想验证提供的网址不包括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和验证器帮助器可以用于什么?
答案 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']
希望这会有所帮助:)