#ruby-on-rails #ruby #validation
#ruby-on-rails #ruby #проверка
Вопрос:
Мне нужно проверять некоторые атрибуты, только если они не пустые.
Например, у пользователя может быть логотип. Если мы попытаемся загрузить его — проверка должна сработать. Если мы просто обновляем данные пользователя без логотипа, проверка должна быть пропущена.
Теперь у меня есть:
В форме есть выбор из двух файлов. Один — логотип, второй — аватар. Оба этих атрибута являются частью пользовательской модели. В пользовательской модели 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 для атрибута, который я хочу изменить?
Комментарии:
1. Что такое validates_preference_of? Вы имеете в виду validate_presence_of?
Ответ №1:
Добавьте :allow_blank => true
, и он должен делать то, что вы хотите.
Комментарии:
1. Просто чтобы добавить, если вы столкнулись с этой проблемой, и вам нужно установить это
:allow_blank => true
для нескольких атрибутов, это может быть признаком того, что вам нужно разделить эти атрибуты на новую модель и установить отношение 1 к 1 к исходной модели. Таким образом, вы можете создать отдельную проверку, для которой будут требоваться эти атрибуты.2. Примечание. если у вас есть несколько проверок в одном и том же поле, каждая из них должна иметь
:allow_blank => true
Ответ №2:
Может :if => lambda {|attr| attr.present?}
быть, поможет?
Комментарии:
1. Мне это нравится, потому что это работает везде, и вам не нужно угадывать, какие методы поддерживают другое решение.
Ответ №3:
Некоторые проверки принимают параметры :allow_blank => true
или :allow_nil => true
.
Если это не удается, используйте условие :if, например:
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? }
Но я рекомендую вам использовать allows . Намного чище.