我有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 :(得分:0)
我认为有两种方法:
表单中有一些隐藏的参数,模型中的attr_accesor
会关闭验证。
使用save(validate: false)
从第二种表单中保存。
接下来,你可以这样做
if validate_object?
validates :email, presence: true
validates :variant, presence: true
end
但是你必须记住,这个对象将来也会无效。
答案 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