【问题标题】:Custom message for wrong format in validates验证中错误格式的自定义消息
【发布时间】:2020-07-04 16:14:23
【问题描述】:

在我的模型/user.rb 我有这个验证

  validates :username, uniqueness: { case_sensitive: false },
                       length: { in: 3..15 },
                       format: { with: /\A[^\.]+\z/ },
                       format: { without: /\s/ }

三个问题:

  1. 我可以用不同的方式编写正则表达式吗?就在一行中。
  2. 如果用户尝试注册为“Magic Mike”,则会显示“无效”。但是太笼统了。如何编辑它以写“没有空白/空格”?
  3. 我可以在注册期间禁止空格键吗?在铁轨上怎么做?我应该使用 javascript 吗?

【问题讨论】:

  • 您能告诉我们您希望在用户名中拥有什么和不喜欢在用户名中拥有什么吗?
  • 我希望用户名包含各种字符(包括日文、中文、韩文等),并且没有 . % , | 等,并且没有空白/空格
  • 如果您希望每个验证有单独的消息,您应该将长度作为单独的验证,格式化为单独的验证。虽然不确定其他语言

标签: ruby-on-rails


【解决方案1】:

你只想要“没有空格”和“只有字母”对吗?

/^\w+$/

您还可以在正则表达式中包含长度要求:

/^\w{3,15}$/

您实际上不能禁止空格键。但是在javascript中,如果在字段中插入空格字符,则会显示错误,并且您可以从输入字段中删除空格。

如果您希望显示更解释性的消息,请使用 message: 选项:

validates :username, uniqueness: {case_sensitive: false, message: 'must be unique'}
validates :username, format: {with: /^\w{3,15}$/, message: 'must be 3-15 letters with no spaces'}

【讨论】:

  • 中文/日文/韩文字符也可以吗?和数字?如何编辑“错误信息”?现在它只说“无效”。不是很清楚...
  • 此解决方案有效。它只会给出一条消息。如果您想要单独的长度验证消息,则必须添加单独的长度验证,就像您在问题中所做的那样
  • 我不知道这是否适用于中文等字符,我已在我的答案中添加了自定义消息供参考
【解决方案2】:

标准正则表达式匹配器(\w, \s 等)仅适用于标准 ASCII 字符。但是,ruby 1.9+ 支持 POSIX 括号表达式,例如 [[:alpha:]] 以匹配 Unicode 字符(中文、韩文等)。因此,与@Les 的 Unicode 非常紧凑的正则表达式等价的是:

/^[[:alpha:]]{3,15}$/

例如:

s = '큰사과'
s.match(/[[:alpha:]]{3,15}/)
=> #<MatchData "큰사과">

带空格:

s = '큰 사과'
s.match(/[[:alpha:]]{3,15}/)
=> nil

Regexp 的 Ruby 文档列出了所有支持的括号表达式。

您可以使用:message 选项设置自定义验证消息:

validates :username, format: {with: /^\[[:alpha:]]{3,15}$/, message: 'no whitespace allowed'}

【讨论】:

  • 如果我只添加 format: { without: /[\s\.\%\&]/ } 你怎么看?
  • 您最了解您的用例,但通常您需要涵盖您的用例的最简单的正则表达式。如果 :without 满足您的需求,那就去做吧。您需要单独指定 :length 验证,但如果您想为每个设置自定义消息,这可能就是您想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 2013-04-08
  • 1970-01-01
相关资源
最近更新 更多