3

我有模型patient。当patient尝试注册时,他会填写字段,例如:nameemailtelephone,并且presence在这些字段上进行验证。我还有另一种表格,医生可以在其中为自己添加病人,这个表格只有一个字段name

问题:我可以以某种方式跳过字段验证emailtelephone但保留验证name吗?

目前,我有这个动作:

def add_doctor_patient
  @patient = @doctor.patients.new(patient_params)
  if params[:patient][:name].present? and @patient.save(validate: false)
    redirect_to doctor_patients_path(@doctor), notice: 'Added new patient.'
  else
    render action: 'new'
  end
end

name参数中存在时,我会跳过验证并保存患者,但当name不存在时,它只会呈现new操作而不会出现错误,并且 simple_form 不会将字段标记为红色。也许有办法引发错误,或者只是另一种解决方案?

UPD

解决方案:按照 Wintermeyer 的答案。由于我有关系patient belongs_to: doctor,我可以使用 - hidden_field_tag :doctor_id, value: @doctor.id,并像人们所说的那样进行检查,unless: ->(patient){patient.doctor_id.present?}。PS如果有人使用设计我们也应该跳过设计所需的验证emailpassword。在我的例子中,我们可以添加到模型中Patient,如下所示:

def password_required?
  false if self.doctor_id.present?
end

def email_required?
  false if self.doctor_id.present?
end
4

5 回答 5

4

我喜欢做的是(在模型中):

attr_accessor :skip_validations

validates :name, presence: :true
validates :email, presence: :true, unless: :skip_validations
validates :telephone, presence: :true, unless: :skip_validations

然后在控制器中:

patient = Patient.new(patient_params)
patient.skip_validations = true

尽管它与其他答案相同,但我发现它更干净。

于 2017-08-25T12:54:36.957 回答
1

这似乎是一个如此简单的问题,但我考虑的时间越长,就会出现更多可能的解决方案。我很难判断哪个是最干燥的。xyz快速而肮脏的解决方案是在医生的表格中添加一个隐藏的布尔字段。如果您使用 Rails 4,则必须在控制器底部添加该属性。这样,您可以在模型中执行以下操作:

validates :name,  presence: true
validates :email, presence: true, unless: ->(patient){patient.xyz.present?}
于 2014-05-11T11:20:35.180 回答
0

你可以这样做:

 validates :name,  presence: true
 validates :email,  presence: true, unless: ->(patient){patient.name.present?}
于 2014-05-11T11:08:02.237 回答
0

我会为患者添加一个额外的字段,这将指示患者是否自行注册。

因此,例如添加一个字段source,可以是patientor doctor,或者如果患者注册了自己,则添加一个布尔字段self_registered,该字段为真。

然后您的验证将变为

validates :name, presence: true
validates :email, presence: true, if: -> (patient.is_self_registered?)

使用临时字段仅在创建用户时有效,但在稍后阶段编辑/更新用户时将失败(因为那时您将不再知道患者是否注册了自己 ----您可以假设它,但永远不知道)。

于 2014-05-11T12:24:58.037 回答
0

我写了一个完成这种“条件”验证的 gem。我的结论是,完成条件验证的最佳方法是让控制器决定何时启用任何非标准验证规则。因此,如果您尽可能多地遵循 RESTful 实践,那么您应该为医生和患者表单提交使用不同的控制器。或者,如果不是,那么至少可以通过某种方式来判断,对吧?在任何情况下,控制器都可以指导模型进行验证。这是 gem 的链接......希望它也适合您的情况:

https://github.com/pdobb/conditional_validation

基本上,它围绕您设置的虚拟属性提供了一些包装方法,我称之为“validation_accessor”。然后,它为其他人在这个线程中建议的相同类型的东西提供语法糖。

于 2014-05-11T12:54:03.113 回答