2016-01-24 105 views
11

我正在使用collection2,我試圖讓它來處理驗證是一種特定的方式。我有一個配置文件架構,看起來有點像這樣:獨立表單驗證與流星

Schema.UserProfile = new SimpleSchema({ 
    name: { 
     type: String, 
     optional: false 
    } 
    location: { 
     type: String, 
     optional: true 
    } 
    gender: { 
     type: String, 
     optional: false 
    } 
}); 

Schema.User = new SimpleSchema({ 
    username: { 
     type: String, 
     optional: true 
    }, 
    emails: { 
     type: Array, 
     optional: true 
    }, 
    "emails.$": { 
     type: Object 
    }, 
    "emails.$.address": { 
     type: String, 
     regEx: SimpleSchema.RegEx.Email 
    }, 
    "emails.$.verified": { 
     type: Boolean 
    }, 
    createdAt: { 
     type: Date 
    }, 
    profile: { 
     type: Schema.UserProfile, 
     optional: true 
    }, 
    services: { 
     type: Object, 
     optional: true, 
     blackbox: true 
    }, 
    roles: { 
     type: [String], 
     optional: true 
    }, 
    heartbeat: { 
     type: Date, 
     optional: true 
    } 
}); 

Meteor.users.attachSchema(Schema.User); 

現在,我的登記表上,我需要用戶選擇他們的性別,再後來他們一旦登錄,用戶都帶有獨立的形式詢問他們的名字和地點。這裏的問題:

註冊表單的作品,一切都通過保存。當它們試圖保存位置和名稱內部形式,雖然我得到一個錯誤:

Error invoking Method 'updateProfile': Gender is required [400] 

我知道這是因爲它是需要在架構,但我已經獲得該信息發生。我怎麼不要求?或者我設置每個表單的驗證?

+0

你在找什麼樣的附加細節? –

+0

我只是尋找更多的反饋和更優雅的解決方案。 – SeanWM

回答

3

SimpleSchema docs

Say you have a required key "friends.address.city" but "friends.address" is optional. If "friends.address" is set in the object you're validating, but "friends.address.city" is not, there is a validation error. However, if "friends.address" is not set, then there is no validation error for "friends.address.city" because the object it belongs to is not present.

所以錯誤發生,因爲你包括兩種形式和性別分佈是不型材中是可選的。我能想到的兩種方法來解決這個問題:

  1. 有都是可選的,幷包含在一個名稱/位置所需的字段(雖然它看起來像的位置可能是基於這兩種情況下可選的下輪廓其他對象你的代碼)和另一個必需的性別字段。我並不特別喜歡這個解決方案,但它可以防止需要表單驗證。

  2. 使用jQuery表單驗證(我使用package themeteorchef:jquery-validation),並使配置文件中的所有字段爲可選。

  3. 它看起來像SimpleSchema接受optional屬性的函數,所以你可以在那裏使用一些自定義邏輯 - 也許你會得到參數或在該函數中的上下文,將允許你做你想做的?

希望幫助!

3

您必須通過jquery添加驗證,或者您可以使用烤麪包機在客戶端顯示錯誤。 請閱讀這個:link

3

我假設你使用aldeed:autoform爲您的窗體。當您在表單中使用normal type時,所有字段(即使已填寫爲已強制標記的字段)都必須提交。有兩種方法可以解決這個問題:

  • 骯髒的方法:用預先填好的值設置隱藏字段。
  • 您還可以將您的表單類型設置爲updateas seen in the doc。這樣,simple-schema將驗證您的newDoc已經充滿您以前的條目而不尖叫。

第二個解決方案是我在大多數情況下使用的解決方案。這加autoform's hooks給你足夠的靈活性,以適應你可能遇到的大多數使用情況。

3

我不知道它是否是更優雅的解決方案,但我們已經停止將simpleSchemas附加到當前項目中的文檔。

我們改爲在每個集合的名稱空間中有不同的模式,一個用於在插入時檢查用戶輸入,一個用於更新,另一個用於在插入新文檔時填充defaultValue(可由客戶端完成或服務器,在這種情況下,我們不檢查輸入)。我們根據我們想要做的事情調用.validate()或.clean()。

巧妙地使用從模式數組構建模式的可能性,我們到最後不會編寫更大的模式(儘管它們中有更多模式),但是我們完全控制何時檢查以及哪些字段是檢查。