2016-12-07 101 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