проблема с передачей логических значений в update_attributes - PullRequest
29 голосов
/ 07 марта 2011

У меня есть следующая модель:

class GuestCatering < ActiveRecord::Base

  # Validation
  validates :name, :presence => true
  validates :order_number, :presence => true
  validates :orderable, :presence => true

end

Но когда я попытаюсь обновить существующую GuestCatering следующим кодом:

guest_catering.update_attributes(:orderable => false)

Переменная гостевого питания является действительным объектом GuestCatering. У объекта guest_catering после обновления есть ошибки, например:

<{[:orderable, ["can't be blank"]]=>nil}>

Но когда я передаю orderable => true, все нормально и без ошибок.

Что здесь не так, почему я не могу установить в false значение?

Ответы [ 3 ]

42 голосов
/ 07 марта 2011

Ваша модель на самом деле ведет себя точно так, как вы сказали, используя validates :orderable, :presence => true

Нет смысла проверять наличие логического флага - это будет true, nilили false - и в мире Ruby nil и false имеют одинаковое семантическое значение, когда речь заходит о булевой логике.

Внутренне, validates :presence полагается на значение проверяемого атрибута для возврата falseкогда blank? вызывается.И в Rails (с ActiveSupport) false.blank? оценивается как true - это означает, что ваше поле не проходит проверку.

Просто удалите эту проверку, и все будет работать как положено.

20 голосов
/ 06 декабря 2012

Как Дэн Чейл уже сказал в своем ответе, логические значения nil и false семантически одно и то же.

Но, если вам действительно нужно это проверить (не разрешив nil),Вы всегда можете сделать:

validates_inclusion_of :orderable, :in => [true, false]

0 голосов
/ 07 марта 2011

Вместо validates :presence => :true вы должны написать свои миграции со значением по умолчанию, например:

t.boolean :orderable, :default => 0

Я предполагаю, что ваше значение по умолчанию должно быть false.Если true, используйте 1 по умолчанию.Затем он установит значение по умолчанию в базе данных.Таким образом, вы можете пропустить проверку проверки.

Причина, по которой вы не можете использовать validates :presence, дана ответом @dan.Присутствие означает не пустое значение, и Rails для этого использует функцию .blank?, а false.blank? равно true

...