如何在rails上跳过多个验证ruby

时间:2016-12-07 17:17:40

标签: ruby-on-rails ruby validation ruby-on-rails-4

我有2个表格。

表单1我有10个字段,我正在验证。

表单2,但它只包含2个字段。

模型相同。

我需要做的是:

验证表单提交字段时的字段。如果我没有发布任何字段,则不应在模型中进行验证。如果我发布5个字段,它应该验证5个字段。如果我发布2个字段,它应该只验证2个而不是全部。

因此表格1应该验证所有10个,表格2只有2个应该验证不是8的其余部分。

这是我的代码:

validates :teacher_number, :title, :name, :gender, :location, :dob,
:contact_mobile, :contact_home, :street, :city, :state, :zip_code, :country, 
presence: true
validates :teacher_number, uniqueness: {scope: :school_id}
validate  :teacher_number_existance, :on => :create
validate  :school_existance, :on => :create

以下是我成功运行的尝试,但其大量代码有点不好用。

 validates :teacher_number, presence: true, if: "teacher_number && teacher_number.blank?"
  validates :title, presence: true, if: "title && title.blank?"
  validates :name, presence: true, if: "name && name.blank?"
  validates :gender, presence: true, if: "gender && gender.blank?"
  validates :location, presence: true, if: "location && location.blank?"
  validates :dob, presence: true, if: "dob && dob.blank?"
  validates :contact_mobile, presence: true, if: "contact_mobile && contact_mobile.blank?"
  validates :contact_home, presence: true, if: "contact_home && contact_home.blank?"
  validates :street, presence: true, if: "street && street.blank?"
  validates :city, presence: true, if: "city && city.blank?"
  validates :state, presence: true, if: "state && state.blank?"
  validates :zip_code, presence: true, if: "zip_code && zip_code.blank?"
  validates :country, presence: true, if: "country && country.blank?"
  validates :teacher_number, uniqueness: {scope: :school_id}, if: "teacher_number && teacher_number.blank?"
  validate  :teacher_number_existance, :on => :create, if: "self.teacher_number && self.teacher_number.blank?"
  validate  :school_existance, :on => :create, if: "self.teacher_number && self.teacher_number.blank?"

修改

更新了我的问题。

4 个答案:

答案 0 :(得分:0)

我认为有两种方法:

  1. 表单中有一些隐藏的参数,模型中的attr_accesor会关闭验证。

  2. 使用save(validate: false)从第二种表单中保存。

  3. 接下来,你可以这样做

    if validate_object? validates :email, presence: true validates :variant, presence: true end

  4. 您可以使用某些模式,例如form object
  5. 但是你必须记住,这个对象将来也会无效。

答案 1 :(得分:0)

如果您希望在不同情况下对数据进行不同的验证,则不应在模型上进行验证。您应该在其他地方进行验证:在使用HTML form validation的视图中,或在使用Rails'Strong Params的控制器中进行验证。

我认为您应该使用HTML表单验证来管理它,因为您担心记录缺少属性。如果您担心人们为记录属性提供禁止的值,那么强参数更有用。

以下是如何使用HTML表单验证来管理它(例如使用HAML):

= form_for @model do |f|
  = f.text_input(:teacher_number, required: true)
  ...all your other inputs...
  = f.submit 'Submit Form'

以下是如何使用Strong Params来限制您可以获得的数量:

class ModelsController < ApplicationController
  def form_action_1
    Model.create(form_1_params)
  end

  def form_action_2
    Model.create(form_2_params)
  end

  private

  def form_1_params
    # let's permit all the things you want for the first form
    params.require(:model).permit(:teacher_number, :title, ...)
  end

  def form_2_params
    # let's permit only the few things you want in the second form
    params.require(:model).permit(:only, :a, :few, :things)
  end
end

答案 2 :(得分:0)

我不确定你究竟在问什么,但也许这种方法可行。写下你的验证:

validates :teacher_number,
  :title,
  :name,
  :gender,
  :location,
  :dob,
  :contact_mobile,
  :contact_home,
  :street,
  :city,
  :state,
  :zip_code,
  :country, 
  presence: true,
  on: :form2
validates :teacher_number, uniqueness: {scope: :school_id}
validate  :teacher_number_existance, :on => :create
validate  :school_existance, :on => :create

第一个验证器底部附近的on: :form2表示验证仅在您明确要求它们运行时才会运行。

因此,在用于保存form2的控制器操作中,您必须执行此操作:

if valid?(:form2) && @model.save

其他验证器将在您正常保存时运行。使用on: validates参数作为您自己的符号(与内置符号相反)在Rails指南中进行了验证,但很容易遗漏。直到最近我才注意到它。我希望这会有所帮助。

答案 3 :(得分:0)

最后,经过这样的反复,下面的解决方案对我来说效果很好。

before_validation :strip_validations

def strip_validations
     ['teacher_number', 'title', 'name', 'gender', 'location', 'dob', 'contact_mobile', 'contact_home', 'street', 'city', 'state', 'zip_code', 'country'].each do |attr|
     errors.add("Teacher", {attr => " #{attr} can't be blank"}) if send(attr.to_sym) && send(attr.to_sym).blank?
    end
end