2016-04-01 2 views
0

У меня есть модельRails прохождения теста проверки

class Vehicule < ActiveRecord::Base 
    before_validation :set_principal, :if =>:new_record? 

    private 
    def set_principal 
     self.principal ||= !!principal 
    end 
end 

Если я проверить это, когда я Vehicule.new.valid? всегда возвращают ложь. Почему мне пришлось добавить true в функцию, чтобы пройти тест?

private 
    def set_principal 
     self.principal ||= !!principal 
     true 
    end 
+0

Поскольку вы не передаете 'принципал', тогда он идет как' nil', а если '!! nil => false' – 7urkm3n

+0

. Если функция возвращает false, проверка модели не выполняется? Я просто хотел установить 'false' в атрибут' main'. Не сделать модель невозможной для создания. Если я хочу, чтобы я мог создать «транспортное средство», моя функция должна вернуть true? Это правильный путь? –

+1

Да 'motorule.new.valid?' Возвращает 'false' модель не будет сохранена. – 7urkm3n

ответ

2

Для начала неудачные проверки заполняют объект ошибки в вашем экземпляре записи. Вы можете увидеть ошибки, запустив model.errors.full_messages, что всегда полезно для отладки.

Во-вторых, проверьте наличие значения с использованием метода present?, а не используя неудобный подход !!, который возвращает false при вызове nil. Это сделает ваш код более понятным, но он также полезен, поскольку он также распознает «пустые» объекты. Другими словами, "".present? == false и [].present? == false и {}.present? == falsenil.present? == false и так далее. Существует также метод blank?, который является логической противоположностью present?.

Наконец, помните о своем возвратном значении при использовании обратного вызова :before_validation. В отличие от других обратных вызовов, это предотвратит проверку, если функция возвращает false.

1

потому что не не nil => false.

В IRB:

foo = nil 
!!foo => false 
1

если вы пытаетесь Vehicule.new(principal: 'WORKS').valid?

def set_principal 
    self.principal ||= !!principal 
end 

Он должен пройти.

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