Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在RubyonRails模型中进行条件验证?_Ruby On Rails_Ruby_Validation - Fatal编程技术网

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