web-dev-qa-db-ja.com

属性が存在する場合のみ検証します(ユーザーが入力した場合のみ)

一部の属性が空でない場合にのみ検証する必要があります。

たとえば、ユーザーはロゴを持っている場合があります。ロードしようとすると、検証が機能するはずです。ロゴなしでユーザーのデータを単に更新する場合、検証をスキップする必要があります。

今私が持っています:

フォームには2つのファイルの選択肢があります。 1つ目-ロゴ、2つ目-アバター。この属性は両方ともユーザーモデルの一部です。ユーザーモデルでは検証があります:

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

これで、選択したロゴとアバターなしでユーザーを作成できますが、ユーザーを編集してロゴのみをアップロードしようとすると、アバターの検証エラーが発生します。アバターとロゴのファイルを選択した場合、空白のままにします-ロゴの検証エラーがあります。

変更する属性の検証のみを実行するにはどうすればよいですか?

58
prosto.vint

追加 :allow_blank => trueそして、あなたが望むことをする必要があります。

119
Mark Thomas

多分 :if => lambda {|attr| attr.present?} 役立ちます?

10
Sławosz

一部の検証では、オプション: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? }

ただし、許可を使用することをお勧めします。ずっときれい。

9
miguel.camba