Когда варианты хэшей (в конце) не разрешены в рельсах 4?

74
8

В Ruby on Rails Tutorial 3rd Edition (6.2 проверки пользователей). При написании некоторого теста у книги есть этот код для класса ActiveRecord User:

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

Последняя строка (уникальность: case_sensitive: false) выдает синтаксическую ошибку.

В онлайн-версии для этого исправлено наличие {}: https://www.railstutorial.org/book/modeling_users

uniqueness: { case_sensitive: false }

Но мой вопрос в том, почему последняя строка выдает ошибку? Я думал, что последний хэш всегда мог опустить {}?

спросил(а) 2016-06-26T21:45:00+03:00 4 года, 8 месяцев назад
1
Решение
61

Я думаю, вы можете просто опустить "один уровень" хэш-фигур.

Итак, здесь:

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

второй аргумент метода validates - фактически хэш. Вы можете визуализировать его так:

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

Если у вас есть вложенная структура хэша (как вы здесь), и вы уже опускаете скобки для хэша верхнего уровня, то вы не можете опустить их для вложенного.

Однако в Coffeescript вы можете сделать это (что я считаю аккуратным)

ответил(а) 2016-06-26T21:53:00+03:00 4 года, 8 месяцев назад
74

Он выдает ошибку, потому что следующий оператор не является корректным выражением 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

ответил(а) 2016-06-26T21:51:00+03:00 4 года, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема