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

#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 . Намного чище.