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

thi*_*non 5 validation ruby-on-rails

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

那可能吗?

感谢大家!

Aru*_*hit 9

这里的任何方式都是您可以在上下文的帮助下完成的方式.假设您有一个User模型,并且您想要验证某些字段.

validates_presence_of :name,: email, on: :special_context
validates_presence_of :name,:email, :password
Run Code Online (Sandbox Code Playgroud)

有了上面2行,你现在可以在下面这样做

@user.valid?(:special_context)
Run Code Online (Sandbox Code Playgroud)

以上将验证nameemail字段.如果你现在写,

@user.valid?
Run Code Online (Sandbox Code Playgroud)

这将执行上存在验证name,emailpassword为你写的字段.

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

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

:on无论上下文如何,都将运行没有选项的验证.具有某些:on选项的验证仅在指定的上下文中运行.

请查看此文档作为官方示例.