【问题标题】:Ruby on Rails Validates Method StructureRuby on Rails 验证方法结构
【发布时间】:2011-12-13 21:51:04
【问题描述】:

我有一个相当简单的 ruby​​ 语法问题(以及其他一些说明),我这辈子都想不通。

上下文是我有非常常见的模型类子类化 ActiveRecord::Base,并且我正在使用验证。

我相信 Ruby 约定喜欢通过将长段代码拆分为多行来保持整洁,如果这些行达到 80 行,除非使用正则表达式很难做到这一点。我的第一个问题是:

如何正确拆分此验证行以使其正常工作?

validates :email, :uniqueness => true, :length => {:within => 5..50}, :format => {:with => /^[^@][\w.-]+@[\w.-]+[.][a-z]{2,4}$/i}

我尝试过类似的方法:

validates(
    :email,
    :uniqueness => true,
    :length => {:within => 5..50},
    :format => {:with => /^[^@][\w.-]+@[\w.-]+[.][a-z]{2,4}$/i}
)

我在某处的 ruby​​ 约定中读到,您可以使用反斜杠分割行,但我还没有尝试过,因为我认为这看起来有点奇怪,特别是当您可以通过确保逗号或操作数在行尾。

我的最后一个问题是:

有人可以编写这个 validates 方法并使用所有正确的大括号和括号吗?也许我对基本语法的去向有点困惑。

快速回顾:

如何正确拆分上面的单行验证?
可以用反斜杠分割 ruby​​ 代码行吗?
有人用大括号和方括号编写了相同的方法。

提前谢谢。

【问题讨论】:

  • 使用反斜杠转义行尾字符现在被认为是不好的做法。否则,您的 validates 方法看起来还不错。把时间花在比这更有意义的事情上。
  • 你是说如果你用逗号分割这一行而不用括号,它会抛出一个语法错误?如果是这样,您可以发布错误吗?
  • 另外,这可能更适合codereview.stackexchange.com
  • 没有任何一个特定的错误,但由于等等,我一直在在线等等错误。我的意思是让大括号卷曲,因为出于某种原因,我认为整个事情在某一时刻都是一个哈希,显然我发布的版本完全没问题=)我只是想知道将它分成多行的正确方法是什么没有错误

标签: ruby-on-rails ruby syntax multiline lines-of-code


【解决方案1】:

你的想法是对的。我会这样写 validates 宏,

validates :email,
  :uniqueness => true,
  :length => {:within => 5..50},
  :format => {:with => /^[^@][\w.-]+@[\w.-]+[.][a-z]{2,4}$/i}

对于类宏,我们真的不需要括号。第一行会清楚地表明我们正在验证:email 属性,随后的几行是对它的各种验证。

是的,您可以使用反斜杠,但它通常是不需要的,而且 imo 对我来说看起来很丑。最好以运算符结尾,然后继续缩进下一行。有关示例,请参见 http://ruby-doc.org/docs/ProgrammingRuby/html/language.html

如果可能,我倾向于将 RegExp 文字全部放在一行中。如果太长,可以改用Regexp.new

【讨论】:

  • 那么验证哈希的参数是什么?如果包含大括号,将它们括在花括号中是正确的方法吗?还是都是论据?
  • 嗯,validates 的参数不是哈希,而是星号或 splat。如果您查看官方 API 的 api.rubyonrails.org,您会发现 validates 具有 validates(*attributes) 的方法签名。因此,如果您查看上面的内容,您将传入两个参数,:email 和哈希
  • 啊,我明白了。感谢您的澄清和快速响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 2011-07-04
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多