2011-08-24 39 views
2

我正在使用Rails 3應用程序,並使用client_side_validations(自動從ActiveRecord模型驗證生成的JavaScript驗證)顯示在JQuery UI對話框中的表單中,我想知道是否有一些來自client_side_validations的javascript函數,我可以在用戶按下對話框提交(OK)按鈕之後調用,以驗證表單中的所有驗證是否在通過javascript提交表單之前通過。在client_side_validations中是否有這樣的事情?我在wiki中注意到一個名爲Client Side Validations callbacks的部分,看起來非常有趣,但是我沒有在gem中看到相應的javascript文件。也許正在進行中的作品或某些不推薦的作品?手動訪問client_side_validations驗證功能

基本上我有一個創建一個包含表單

$(function() { 
    $("#subscription_dialog").dialog({ 
     autoOpen: false, 
     show: "blind", 
     hide: "blind", 
     width: 'auto', 
     height: 'auto', 
     modal: true, 
     title: "Become an Empower United member", 
     buttons: { 
      "OK": function() { 
       if ($('form[data-validate]').validate()) { 
        $('#new_subscription').submit(); 
        $(this).dialog("close"); 
       } 
      }, 
      "Cancel": function() { 
       $(this).dialog("close"); 
      } 
     } 
    }); 

    $("#subscribe").click(function() { 
     $("#subscription_dialog").dialog("open"); 
     return false; 
    }); 
}); 

我需要的表格前,一些驗證檢查提交位的對話框這個JavaScript片段,否則會對話即使在它的無效數據被關閉。我可以用jQuery的驗證插件編寫一個表單,但我不想像這樣從模型層複製驗證 - 我寧願讓它們始終保持同步。

預先感謝您可能決定渲染的任何幫助!

回答

2

你完成client_side_validations安裝過程後(下的github README安裝,確保做軌道g client_side_validations:copy_assets如果on Rails的3.1+)一個rails.validations.js文件應該被丟棄到您的app/assets/javascripts目錄。

這包含用於客戶端驗證的javascript源代碼。如果您在那裏徘徊,可以看到它將javascript ajax:beforeSendsubmit事件處理程序綁定到您的表單。

所以他們應該在你的表單自動提交之前被調用。

然而,約手動應答更寬泛的問題,觸發驗證....

你可以打電話給你的表格上trigger並提供ajax:beforeSend事件手動觸發驗證。您還需要傳入一個包含表單DOM元素的目標屬性的對象(因爲rails.validation.js源代碼會檢查以確保它只響應該表單元素的事件)。

有一點需要注意的是,client_side_validations會監聽更改事件並跟蹤自上次驗證嘗試以來您的輸入是否已更改。因此,如果自上次驗證以來沒有任何字段發生更改,驗證將不會運行。在這種情況下,您也可以手動觸發更改。

所以......,將該代碼:

handleAjaxError = function(event, data, status) { 
     $("form input").trigger("change"); 
     $("form").trigger("ajax:beforeSend", { target: this.$("form")[0] }); 
    }; 

不可否認,這種感覺那種哈克,引發了 「AJAX:beforeSend」。您也可以直接撥打isValid功能表單上,但是這需要你在驗證,您只能從窗口DOM元素獲得通過:

formValidationSettings = window[$('form').attr('id')]; 
    $('form').isValid(formValidationSettings.validators); 

挑選你的毒藥

如果handleAjaxError功能似乎很奇怪,我需要這樣做來處理電子郵件唯一性ajax驗證的競爭條件,其中兩個用戶試圖同時註冊同一封電子郵件。客戶端Ajax驗證通過了兩個用戶的唯一性,第一個提交獲得成功,第二個獲取服務器端驗證失敗。我希望ajax錯誤處理程序通過重新運行驗證來處理故障。

+0

這是真正有用的,謝謝! – hoitomt

+0

我想澄清一件事。看起來,將兩種方法結合可以產生最佳結果。當我嘗試使用第二種方法來查看是否需要將信息發送到服務器時,它總是返回誤報。正如您在Jimbo之前所說的那樣,我認爲這是因爲客戶端驗證會跟蹤已更改的元素。因此觸發事件來強制驗證似乎也會在正確使用isValid後給出正確的結果。 –

5

上面的答案沒有效果。我試圖查看他們的代碼,並最終找出答案。

form_validators = ClientSideValidations.forms[form.attr('id')].validators 
form.isValid(form_validators) 

這肯定會起作用。

這太晚了。但對於像我這樣的人來說。這將有所幫助。

+0

謝謝發佈!救了我。 – Eskim0