验证除Rails中的一个属性之外的所有属性

时间:2015-08-18 17:27:41

标签: ruby-on-rails validation

我正在尝试使用valid?方法在我的模型中进行自定义验证。我需要运行此模型的所有验证,但密码除外。

这样的事情:

@resource = SalesPartner.new(permitted_params.merge(parent: current_sales_partner))

respond_to do |format|

  if @resource.valid?(except: :password)
    @resource.generate_authentication_token

    SalesPartnerMailer.mail_new_sales_partner(@resource.email,
      { auth_token: @resource.authentication_token, id: @resource.id, level: @resource.level }
    ).deliver

    flash[:success] = "#{@resource.level} criado com sucesso."
    format.html { render "#{@path}/index" }
  else
    logger.log_and_alert_save_error(@resource, flash, "Ocorreu um erro ao salvar.")
    format.html { render "#{@path}/new" }
  end

end

这可能吗?

谢谢大家!

3 个答案:

答案 0 :(得分:7)

这里的任何方式都可以借助 context 来完成。假设您有一个User模型,并且您想验证某些字段。

validates_presence_of :name,: email, on: :special_context
validates_presence_of :name,:email, :password

使用以上两行,您现在可以执行以下操作

@user.valid?(:special_context)

以上内容将验证nameemail字段。如果你现在写,

@user.valid?

这将在您编写的nameemailpassword字段中执行状态验证。

阅读valid?(context = nil)以了解上下文

  

运行指定上下文中的所有验证。如果参数为false(默认为nil),则如果:create为真,则上下文设置为new_record?,如果不是,则设置为:update

     

无论上下文如何,都将运行没有:on选项的验证。使用某个:on选项的验证只会在 指定的上下文 中运行。

将此documentation也视为官方示例。

答案 1 :(得分:2)

上下文可以真正帮助你,但也许不是。

validates_presence_of :name,: email, on: :special_context
validates_presence_of :name,:email, :password

这是因为当您使用validates_presence_of而未指定其上下文时,它将应用于所有上下文(无)。请参阅参考here所以,也许您可​​以尝试以下代码:

validates_presence_of :name, :email, on: :special_context
validates_presence_of :name, :email, :password, on: [ :create, :update]

答案 2 :(得分:0)

只是发现了另一种机制来跳过对指定上下文的验证,因为指定所有其他上下文并不总是合适的:

validates_presence_of :name, :email, on: :special_context
validates_presence_of :name, :email, :password, if: -> {Array(validation_context).exclude?(:special_context)}

注意:validation_context可以是数组。