2016-12-07 70 views
0

我有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?" 

编辑

更新了我的问题。

回答

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 
0

我看到这两种方式:

  1. 在形式上一些隐藏PARAM和attr_accesor模型关闭验证。

  2. 使用save(validate: false)从第二种形式保存。

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

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

  4. 你可以使用一些模式,比如form object

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

+0

谢谢你的回答,但这不是我的情况。在我的关键字,'老师'或'personal_teacher'的情况下,存在隐藏的参数 – LearningROR

0

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

我认为你应该使用HTML表单验证来管理这个,因为你担心记录缺少属性。如果您担心人们为记录属性提供禁止的值,Strong Params更加有用。

这里是你将如何使用HTML表单验证来管理这个(使用HAML为例):

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

这里是你将如何使用强大的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 
+0

谢谢您的详细回复,但现在有一天人们通过检查表单并删除必填字段来破解表单:)另外,当人们会这样做时,它会在安全方面崩溃一切:)我正在检查两种形式的东西意味着我需要和模型中我有验证。安全检查:D问题是我无法在需要时使用他们:( – LearningROR

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接近第一确认底部意味着,如果你不明确的告诉他们运行验证才能运行。

所以在保存窗口2控制器的动作,你就必须做到这一点:当您保存

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

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

+0

不知怎的,你得到了正确的方式,让我解释你说,我有10个字段的形式1和2个字段的形式2。它说你的8个其他字段是空的并填充它们。我想绕过表单2的所有8个验证。你说什么?我没有创建控制器的方法。任何想法? – LearningROR

+0

更新我的问题 – LearningROR