Подтвердить что ты не робот

Проверить атрибут только в том случае, если он присутствует (только если пользователь заполнил его)

Мне нужно проверить некоторые атрибуты ТОЛЬКО, если они не пусты.

Например, пользователь может иметь логотип. Если мы попытаемся загрузить его - валидация должна работать. Если мы просто обновляем данные пользователя без логотипа, валидация должна быть пропущена.

Теперь у меня есть:

Форма имеет выбор из двух файлов. Один - логотип, второй - аватар. Оба этих атрибута являются частью модели User. В модели пользователя a есть проверка:

validates_preference_of :logo_file_name, :message=>I18n.t("...")
validates_format_of :logo_file_name, :with=>/\.(jpeg|jpg|png|gif)$/i, :message=> I18n.t("...")
validates_preference_of :avatar_file_name, :message=>I18n.t("...")
validates_format_of :avatar_file_name, :with=>/\.(jpeg|jpg|png|gif)$/i, :message=> I18n.t("...")

В этом случае, если мы попытаемся создать нового пользователя без выбранного логотипа и аватара, у нас будут ошибки (наша проверка). Я попробовал проверку изменений и добавил ": on = > : update" следующим образом:

validates_preference_of :logo_file_name, :message=>I18n.t("..."), :on => :update
validates_format_of :logo_file_name, :with=>/\.(jpeg|jpg|png|gif)$/i, :message=> I18n.t("..."), :on => :update
validates_preference_of :avatar_file_name, :message=>I18n.t("..."), :on => :update
validates_format_of :avatar_file_name, :with=>/\.(jpeg|jpg|png|gif)$/i, :message=> I18n.t("..."), :on => :update

Теперь я могу создать пользователя без выбранного логотипа и аватара, но если я попробую отредактировать пользователя и попробовать загрузить только логотип - у меня есть ошибки проверки аватара. Если я выберу файл для аватара и логотип, оставьте пустым - у меня есть ошибки проверки для логотипа.

Как я могу запустить проверку ony для атрибута, который я хочу изменить?

4b9b3361

Ответ 1

Добавьте :allow_blank => true, и он должен делать то, что вы хотите.

Ответ 2

Некоторые проверки принимают параметры :allow_blank => true или :allow_nil => true.

Если это не удается, используйте: if condition, например:

validates_format_of :avatar_file_name, 
 :with=>/\.(jpeg|jpg|png|gif)$/i, 
 :message=> I18n.t("..."), 
 :on => :update,
 :if => lambda{ |object| object.avatar_file_name.present? }

Но я призываю вас использовать разрешения. Гораздо чище.

Ответ 3

Может быть, :if => lambda {|attr| attr.present?} поможет?