【问题标题】:How to skip multiple validation ruby on rails如何在rails上跳过多个验证ruby
【发布时间】:2016-12-07 17:17:40
【问题描述】:

我有 2 个表格。

Form 1 我有 10 个要验证的字段。

Form 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?"

编辑

更新了我的问题。

【问题讨论】:

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


    【解决方案1】:

    我看到了两种方法:

    1. 表单中的一些隐藏参数和模型中的attr_accesor 用于关闭验证。

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

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

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

    4. 您可以使用一些模式,例如form object

    但是你必须记住,这个对象将来也将是无效的。

    【讨论】:

    • 感谢您的回答,但这不是我的情况。在我的情况下,隐藏参数确实存在关键字 teacherpersonal_teacher
    【解决方案2】:

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

    我认为您应该使用 HTML 表单验证来管理此问题,因为您担心记录 缺少 属性。如果您担心人们为记录属性提供 forbidden 值,Strong Params 会更有用。

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

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

    以下是您将如何使用强参数来限制您可以获得的东西的数量:

    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
    

    【讨论】:

    • 感谢您的详细回复,但现在人们通过检查表单并删除必填字段来破解表单:) 此外,当人们这样做时,它会在安全性方面崩溃:) 我是检查这两个东西意味着在我需要的表格和模型中我有验证。安全检查 :D 问题是我无法在需要时使用它们 :(
    【解决方案3】:

    我不确定您到底在问什么,但也许这种方法会奏效。像这样写你的验证:

    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
    

    其他验证器将在您保存时正常运行。 Rails 指南中介绍了将validateson: 参数用于您自己的符号(而不是内置符号)进行验证,但很容易错过。直到最近我自己才注意到它。我希望这会有所帮助。

    【讨论】:

    • 不知怎的,你得到了正确的方法。让我给你解释一下。说,我有 10 个字段的表格 1 和 2 个字段的表格 2。提交表格 2 后,它说您的 8 个其他字段为空并填写。我想绕过表格 2 的所有这 8 个验证。你说什么?我在控制器中没有创建方法。有什么想法吗?
    • 更新了我的问题
    【解决方案4】:

    最后,在下面的解决方案来回折腾之后,对我来说效果很好。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      相关资源
      最近更新 更多