2016-06-26 4 views
2

In Ruby on Rails Tutorial 3rd Edition (6.2 Benutzer Validierungen) Während einige Test zu schreiben, hat das Buch diesen Code für die User-Klasse Active:Wann sind Hash-Optionen (am Ende) in den Schienen 4 nicht erlaubt?

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 

Die letzte Zeile (Einzigartigkeit: CASE_SENSITIVE: false) wirft ein Syntax-Fehler. https://www.railstutorial.org/book/modeling_users zu

uniqueness: { case_sensitive: false } 

Aber meine Frage ist warum nicht die letzte Zeile einen Fehler aus:

Die Online-Version hierfür ist {} zu haben, korrigiert? Ich dachte der letzte Hash könnte immer die {} weglassen?

Antwort

2

Es wirft einen Fehler, da die folgende Anweisung keine gültige Aussage Ruby ist:

uniqueness: case_sensitive: false 

Es

{ uniqueness: { case_sensitive: false }} 

werden sollte, wenn ein Hash auf eine Methode übergeben, können Sie die {} weglassen.

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

Aber in Ihrem Fall ist es ganz anders: Sie einen Hash definieren Tasten wie presence, format, uniqueness enthält. Der Wert des Schlüssels uniqueness soll auch ein Hash sein, aber Sie definieren es nicht richtig.

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

Ich denke, Sie können nur "eine Ebene" von Hash-Klammern weglassen.

Also in diesem hier:

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

das zweite Argument der validates Methode ist eigentlich ein Hash. Sie können es wie so visualisieren:

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

Wenn Sie eine verschachtelte Hash-Struktur haben (wie Sie hier tun), und Sie sind bereits die Klammern für die Top-Level-Hash weggelassen, dann kann man nicht auslassen sie für der Verschachtelte.

In Coffeescript, können Sie dies tun (was ich finde)