Ответ 1
Добавьте :allow_blank => true
, и он должен делать то, что вы хотите.
Мне нужно проверить некоторые атрибуты ТОЛЬКО, если они не пусты.
Например, пользователь может иметь логотип. Если мы попытаемся загрузить его - валидация должна работать. Если мы просто обновляем данные пользователя без логотипа, валидация должна быть пропущена.
Теперь у меня есть:
Форма имеет выбор из двух файлов. Один - логотип, второй - аватар. Оба этих атрибута являются частью модели 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 для атрибута, который я хочу изменить?
Добавьте :allow_blank => true
, и он должен делать то, что вы хотите.
Некоторые проверки принимают параметры :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? }
Но я призываю вас использовать разрешения. Гораздо чище.
Может быть, :if => lambda {|attr| attr.present?}
поможет?