Ruby on rails 如何在RubyonRails模型中进行条件验证?
我有一个Ruby on rails 如何在RubyonRails模型中进行条件验证?,ruby-on-rails,ruby,validation,Ruby On Rails,Ruby,Validation,我有一个研究,可以有参与者。我有一个用户可以添加参与者的窗口。它看起来有点像一张桌子: name | company | email OR mobile | timezone name | company | email OR mobile | timezone name | company | email OR mobile | timezone 默认情况下,屏幕有三个字段集行,如果需要,用户可以添加更多行。每行为一名参与者 我希望我的参与者模型只验证已填写的行,并忽略空白行,因为即使我们默
研究
,可以有参与者
。我有一个用户可以添加参与者的窗口。它看起来有点像一张桌子:
name | company | email OR mobile | timezone
name | company | email OR mobile | timezone
name | company | email OR mobile | timezone
默认情况下,屏幕有三个字段集行,如果需要,用户可以添加更多行。每行为一名参与者
我希望我的参与者
模型只验证已填写的行,并忽略空白行,因为即使我们默认向用户显示三个,但并非所有三个都是必填字段
以下是app/models/participants.rb
的相关部分
class Participant < ApplicationRecord
belongs_to :study
validates :name, presence: true
validates :company, presence: true
validates :time_zone, presence: true
if :channel == 'sms'
validates :mobile_number, presence: true
elsif :channel == 'email'
validates :email, presence: true
end
end
问题是我得到了一个错误,因为simple_form认为所有三个字段都是必需的,而不仅仅是第一行。Rails的验证器接受以下条件:
validates :mobile_number, presence: true, if: Proc.new { |p| p.study.channel == 'sms' }
validates :email, presence: true, if: Proc.new { |p| p.study.channel == 'email' }
Rails的验证器接受以下条件:
validates :mobile_number, presence: true, if: Proc.new { |p| p.study.channel == 'sms' }
validates :email, presence: true, if: Proc.new { |p| p.study.channel == 'email' }
默认情况下,所有输入都是必需的。当表单对象包括
ActiveModel::验证(例如,在活动
记录模型),仅当存在时才需要字段
验证。否则,Simple Form会将字段标记为可选字段。对于
出于性能原因,在以下验证中跳过此检测:
使用条件选项,例如:if和:除非
当然,任何输入的必需属性都可以被覆盖
根据需要:
尝试将所有输入设置为必需:false。这应该允许跳过简单的表单验证,数据进入控制器,可以对模型进行过滤或/和验证,以及在持久化之前要执行的所有其他操作
在模型类中,可以使用多种验证方法,例如:
您还可以使用带有符号的:if和:除非选项,该符号对应于将在验证发生之前调用的方法的名称。这是最常用的选项
比如说
class Participant < ApplicationRecord
belongs_to :study
validates :name, presence: true
validates :company, presence: true
validates :time_zone, presence: true
validates :mobile_number, presence: true if: :channel_is_sms?
validates :email, presence: true if: :channel_is_email?
def channel_is_sms?
channel == "sms"
end
def channel_is_email?
channel == "email"
end
end
课堂参与者
或者您也可以使用自定义验证器执行所有需要验证的操作。比如说
class MyValidator < ActiveModel::Validator
def validate(record)
unless record.channel == 'sms'
...
... actions here
...
end
end
end
class Person
include ActiveModel::Validations
validates_with MyValidator
end
class MyValidator
默认情况下,所有输入都是必需的。当表单对象包括
ActiveModel::验证(例如,在活动
记录模型),仅当存在时才需要字段
验证。否则,Simple Form会将字段标记为可选字段。对于
出于性能原因,在以下验证中跳过此检测:
使用条件选项,例如:if和:除非
当然,任何输入的必需属性都可以被覆盖
根据需要:
尝试将所有输入设置为必需:false。这应该允许跳过简单的表单验证,数据进入控制器,可以对模型进行过滤或/和验证,以及在持久化之前要执行的所有其他操作
在模型类中,可以使用多种验证方法,例如:
您还可以使用带有符号的:if和:除非选项,该符号对应于将在验证发生之前调用的方法的名称。这是最常用的选项
比如说
class Participant < ApplicationRecord
belongs_to :study
validates :name, presence: true
validates :company, presence: true
validates :time_zone, presence: true
validates :mobile_number, presence: true if: :channel_is_sms?
validates :email, presence: true if: :channel_is_email?
def channel_is_sms?
channel == "sms"
end
def channel_is_email?
channel == "email"
end
end
课堂参与者
或者您也可以使用自定义验证器执行所有需要验证的操作。比如说
class MyValidator < ActiveModel::Validator
def validate(record)
unless record.channel == 'sms'
...
... actions here
...
end
end
end
class Person
include ActiveModel::Validations
validates_with MyValidator
end
class MyValidator
谢谢。你能解释一下新程序吗?我能不能说一些类似于if:self.channel==“sms”
?嗯,这不起作用,我想我不清楚——研究有一个渠道,而不是参与者。我认为您的答案目前正在寻找participant.channel,因此是p.Thank。你能解释一下新程序吗?我能不能说一些类似于if:self.channel==“sms”
?嗯,这不起作用,我想我不清楚——研究有一个渠道,而不是参与者。我认为您的答案目前正在寻找participant.channel,因此是p。谢谢!关于第一点,我尝试将required:false
作为简单表单文档后面表单的默认值,但无法实现。将required:false
放在每个输入上就成功了。我还发现,在这种情况下,只有一种方法可以检查它是否是sms,然后使用除非作为电子邮件验证器,这有点干净。e、 g.如果是短信?
和除非短信?
在移动域和电子邮件域验证行的末尾。谢谢!关于第一点,我尝试将required:false
作为简单表单文档后面表单的默认值,但无法实现。在每个输入d上放置required:false