我知道 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
但没有运气!
答案 0 :(得分:0)
#validates
是 ActiveRecord
对象上的类方法,它接受一个可选参数 :if
。
:if
参数的值可以是以下几项之一。
如果它是一个符号,它将在被验证的对象上调用具有该名称的实例方法。例如validates :buyer_type, presence: true, if: :buyer?
从概念上讲,它会对正在验证的对象执行 object.send(:buyer?)
。如果该方法返回真值(nil
或 false
以外的任何值),则验证将运行。
它会像这样实现:
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