如果满足条件则验证存在

时间:2021-02-22 23:19:36

标签: ruby-on-rails validation

我知道 Rails 中的验证相当简单,但我不知道如何验证是否满足一个条件。我有两种注册表单,一种带有和不带有以下代码:

<%= f.select :buyer_type, ['Option 1', 'Option 2', 'Option 3'], {include_blank: "Please Select"}, { class: "form-control" , required: 'required'} %>

两者都有以下代码,根据角色变化:

<%= f.hidden_field :registered_as, value: 'buyer' %>

<%= f.hidden_field :registered_as, value: 'developer' %>

在我的 user.rb 文件中,我有以下行来帮助验证 f.select 选项:

validates :buyer_type, presence: true

但是当我在另一个没有 f.select 选项的表单上测试注册时,它不会提交表单。

有没有一种方法可以编辑 validates :buyer_type,以便仅使用代码的 f.select 组件激活带有 f.hidden_field :registered_as 选项的表单?

编辑:我已经尝试过这样的事情:

validates :buyer_type, presence: true
    if :registered_as value: 'buyer'
    end

但没有运气!

1 个答案:

答案 0 :(得分:0)

#validatesActiveRecord 对象上的类方法,它接受一个可选参数 :if

:if 参数的值可以是以下几项之一。

如果它是一个符号,它将在被验证的对象上调用具有该名称的实例方法。例如validates :buyer_type, presence: true, if: :buyer?

从概念上讲,它会对正在验证的对象执行 object.send(:buyer?)。如果该方法返回真值(nilfalse 以外的任何值),则验证将运行。

它会像这样实现:

class User < ApplicationRecord
  validates :buyer_type, presence: true, if: :buyer?

  def buyer?
    registered_as == "buyer"
  end
end

但是对于简单的验证,您可以使用 Lambda - 一个匿名函数,而不是向您的对象添加方法。对于不需要重复使用的简单条件,这更简洁且更易于阅读。这是 stabby lambda 的语法(因为 -> 看起来像一个刺伤的东西)。

这是一个使用 lambda 函数的简单示例。它将 lambda 函数分配给变量 x,然后调用该函数。

irb(main):001:0> x = -> { puts "hi" }
=> #<Proc:0x00007ff930921068@(irb):1 (lambda)>
irb(main):002:0> x.call
hi
=> nil

以下是它在验证中的使用方式:

validates :buyer_type, presence: true, if: -> { registered_as == 'buyer' }

lambda 的主体在被验证对象的上下文中运行,因此您可以再次访问对象的实例方法进行验证。

关于验证的 rails 指南是一个很好的资源:https://guides.rubyonrails.org/active_record_validations.html#conditional-validation

您可以在此处阅读更多关于 Procs 和 Lambdas 的信息https://ruby-doc.org/core-3.0.0/Proc.html

相关问题