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

时间:2011-10-23 18:08:40

标签: ruby-on-rails ruby validation

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

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

现在我有:

表单可以选择两个文件。一个 - 徽标,第二个 - 头像。 这两个属性都是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

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

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

3 个答案:

答案 0 :(得分:115)

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

答案 1 :(得分:10)

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

答案 2 :(得分:9)

某些验证会接受选项: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? }

但我鼓励你使用allow。更干净。