2017-01-31 46 views
0

Простая форма автоматически определяет, существует ли проверка validates :xxx, presence: true, и отображает это поле как обязательное (например, со звездочкой, добавленной к метке).Простая форма и обязательные поля: не обрабатывается при необходимости, если условие добавлено в валидацию

validates :parent, presence: true 

Это приводит к:

asterisk

Интересно, что как только я добавить условие для такой проверки ...

validates :parent, presence: true, if: -> { true } 

... это не делает это не более:

no asterisk

Это ошибка или функция?

ответ

1

Это ожидаемое поведение, проверки выполняются только при сохранении объекта в db, поэтому у вас нет способа узнать, возвращает ли лямбда true или нет до тех пор. Конечно, в вашем случае он всегда возвращает true, но представьте, что у вас есть ограничение по времени в вашей лямбде или другом более сложном состоянии, например.

...., -> { Time.zone.now > Date.new(2017, 1, 1) } 

Может быть, когда вы создаете объект для формы это возвращает false, но когда форма фактически подчинялся и сохраняется в БД уже прошло достаточно времени для того, чтобы вернуть true.

Таким образом, нет возможности для simple_form знать, когда создается форма, независимо от того, требуется ли это поле или нет.

0

Вы можете назвать это особенностью, поскольку это преднамеренно. Если вы посмотрите на код драгоценного камня (особенно в calculate_required и conditional_validators?), вы заметите, что если у проверки наличия присутствует условие, например if или unless, поле больше не будет помечено как требуется.

0

Я решил, как это для :terms быть Флажок элемент:

validates :terms, presence: true, acceptance: true 

С этим, он проверяет на уровне формы для проверки того, что «термин» флажок представлен только после того, как он установлен. Надеюсь, это поможет кому-то в будущем.

 Смежные вопросы

  • Нет связанных вопросов^_^