rails 4 中什么时候不允许选项散列(最后)?

When are option hashes (at the end) not allowed in rails 4?

在 Ruby 上 Rails 教程第 3 版(6.2 用户验证) 在编写一些测试时,这本书为 ActiveRecord 用户提供了这段代码 class:

class User < ActiveRecord::Base
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: case_sensitive: false
end

最后一行 ( uniqueness: case_sensitive: false ) 抛出语法错误。

此在线版本更正为具有 {} : https://www.railstutorial.org/book/modeling_users

uniqueness: { case_sensitive: false }

但我的问题是为什么 最后一行会抛出错误?我认为最后一个哈希总是可以省略 {}?

它抛出错误,因为以下语句不是有效的 Ruby 语句:

uniqueness: case_sensitive: false

应该是

{ uniqueness: { case_sensitive: false }} 

将哈希传递给方法时,可以省略 {}

call_method(foo: "bar")
call_method({ foo: "bar" })

但在您的情况下完全不同:您正在定义一个包含 presenceformatuniqueness 等键的散列。键 uniqueness 的值也应该是 Hash,但您没有正确定义它。

call_method(foo: { bar: "baz" }) # valid
call_method({ foo: { bar: "baz" }}) # valid
call_method(foo: bar: baz) # invalid

我认为你只能省略 "one level" 个散列括号。

所以就在这里:

  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX }

validates 方法的第二个参数实际上是一个散列。你可以这样想象它:

  validates(:email, { presence: true, length: { maximum: 255 } })

如果您有一个嵌套的散列结构(就像您在此处所做的那样)并且您已经省略了顶级散列的大括号,那么您不能为嵌套的散列省略它们。

不过,在 Coffeescript 中,您可以这样做(我觉得很简洁)