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" })
但在您的情况下完全不同:您正在定义一个包含 presence
、format
、uniqueness
等键的散列。键 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 中,您可以这样做(我觉得很简洁)
在 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" })
但在您的情况下完全不同:您正在定义一个包含 presence
、format
、uniqueness
等键的散列。键 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 中,您可以这样做(我觉得很简洁)