仅在属性存在时验证属性(仅当用户填写时)

pro*_*int 60 ruby validation ruby-on-rails

如果它们不是空的,我只需要验证一些属性.

例如,用户可以具有徽标.如果我们尝试加载它 - 验证应该有效.如果我们只是更新没有徽标的用户数据,则必须跳过验证.

我现在有:

表单可以选择两个文件.一个 - 徽标,第二个 - 头像.这两个属性都是User模型的一部分.在用户模型中,有一个验证:

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("...")
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果我们尝试创建没有选择徽标和头像的新用户,我们将会出现错误(我们的验证).我尝试了更改验证并添加":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
Run Code Online (Sandbox Code Playgroud)

现在我可以创建没有选择徽标和头像的用户,但如果我尝试编辑用户并尝试上传只有徽标 - 我有头像的验证错误.如果我选择文件的头像和徽标留空 - 我有徽标验证错误.

我如何运行验证ony我想要更改的属性?

Mar*_*mas 123

添加:allow_blank => true,它应该做你想要的.


Sła*_*osz 10

也许:if => lambda {|attr| attr.present?}会有所帮助?


mig*_*mba 10

一些验证接受选项: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? }
Run Code Online (Sandbox Code Playgroud)

但我鼓励你使用allow.更清洁.