【问题标题】:Validating all attributes except one in Rails在 Rails 中验证除一个属性之外的所有属性
【发布时间】:2015-08-18 17:27:40
【问题描述】:

我正在尝试使用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

这可能吗?

谢谢大家!

【问题讨论】:

  • 您尝试运行的验证是什么。
  • valid? 将运行您在相应模型(resource 类)中注册的验证。
  • 更新了代码。我需要跳过密码验证,因此在这种情况下将创建没有密码的 SalesPartner 对象。注意:SalesPartner 使用的是具有密码验证功能的设计。
  • 你没有明白我的意思。您正在验证的内容是什么?
  • 我正在验证姓名、电子邮件的存在,并对 coupon_discount 属性进行自定义验证。

标签: ruby-on-rails validation


【解决方案1】:

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

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

注意:validation_context 可以是数组。

【讨论】:

    【解决方案2】:

    这里的任何方式都是您可以在 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),则如果new_record? 为真,则上下文设置为:create,否则为:update

    没有:on 选项的验证将在任何上下文中运行。带有某些:on 选项的验证只会在指定的上下文中运行。

    查看此documentation 也可作为官方示例。

    【讨论】:

    • 哇,帮了我很多忙!谢谢!
    【解决方案3】:

    上下文确实可以帮助您,但跟随可能不会。

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 2011-03-17
      • 2015-07-04
      • 1970-01-01
      • 2016-02-19
      • 2011-10-01
      相关资源
      最近更新 更多