2016-06-26 1 views
2
Rubyで

をチュートリアル第3版(6.2ユーザーの検証) いくつかのテストを書いている間、本はActiveRecordのユーザークラスのため、このコードがあります。オプションのハッシュは(最後の)いつレール4では使用できませんか? on Railsの

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

最後の行(一意性:CASE_SENSITIVE:false)をスローします構文エラー。

このため、オンラインバージョン

は{}を持つように修正される: https://www.railstutorial.org/book/modeling_users

uniqueness: { case_sensitive: false } 

にしかし、私の質問ははなぜ最後の行がエラーを投げるんですか?私は最後のハッシュがいつも{}を省略できると思いましたか?

答えて

2

次の文は、有効な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 
1

ハッシュカッコの「1つのレベル」のみを省略することができます。だからここにこの権利で

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

validatesメソッドの2番目の引数は、実際のハッシュです。 (あなたがここで行うように)あなたは、ネストされたハッシュ構造を持っている場合は

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

、あなたはすでに、あなたがのためにそれらを省略することができない、トップレベルのハッシュ用のかっこを省略している:あなたはそうのようにそれを視覚化することができますネストされたもの

Coffeescriptでは、これを行うことができます(これはきれいです)

関連する問題