2015-02-07 43 views
0

之前在Rails 4.1.8Rails的AJAX形式:如何解決了場的形式被髮送

我工作的支付形式(布倫特裏支付),我希望它通過Ajax工作。我無法使用標準的Braintree表單設置,因爲它不提供onSuccess和onError方法。但是我可以使用特殊的JavaScript函數查看字段,與Braintree服務器進行對話並返回一個隨機數,然後將其發送到表單中。所以...

我創建了一個表單並設置了remote:true。這允許rails_ujs接管並將表單添加到我的服務器。但在此之前,我必須致電Braintree並獲得回覆。他們提供的javascript函數進行異步調用。因此,我無法掛鉤到Rails的ajax:在回調之前,因爲Braintree的JavaScript調用在'ajax:before'傳遞給主要的rails_ujs之後返回一個值,這些主要的rails_ujs將表單內容發送到服務器,因此我得到服務器端的空白字段。

Braintree提供的js函數確實具有正常的回調,所以我可以掛鉤成功回調並觸發表單提交。所以,我想掛接到提交按鈕的點擊事件,禁用默認情況下,呼喚布倫特裏,然後當我得到一個成功的響應我打電話

$('#myForm').submit() 

這並不實際發送跨數據,但它是一個正常非xhr POST。深入挖掘,我發現rails_ujs的行爲並不像掛鉤form.submit()事件,而是掛載到提交按鈕的click()事件。所以通過捕獲該事件,防止默認行爲,調用Braintree,然後觸發表單上的submit()事件,我完全刪除了Rails ajax的東西。

關鍵的問題是如何觸發一個Rails ajax表單來執行遠程發送,而無需點擊表單中的提交按鈕?

作爲一種解決方法,我可以執行手動編碼的$ .ajax調用,也可以在窗體上放置一個隱藏的提交按鈕,以及另一個可見的按鈕,用於執行Braintree調用,然後觸發隱藏的提交按鈕的單擊。至少可以讓所有的Rails表單提交csrf標記爲我完成的東西。但我想知道爲什麼我不能打電話給form.submit()

回答

3

刪除remote:true爲您的表單並交換爲使用原生javascript提交您的表單。

braintree.setup(
 
    braintree_token, 
 
    'dropin', { 
 
    container: 'dropin', 
 
    paymentMethodNonceReceived: function (event, nonce) { 
 
    $('.braintree-checkout').append("<input type='hidden' name='payment_method_nonce' value='"+ nonce +"'></input>"); 
 
    $.ajax({ 
 
     url: braintree_charge_path, 
 
     type: 'post', 
 
     data: $('.braintree-checkout').serialize(), 
 
     context: $('.braintree-checkout'), 
 
     beforeSend: function(evt, xhr, settings){ 
 
     // Stuff to do before braintree submits, e.g. loading screen 
 
     }, 
 
     complete: function(evt, xhr, status){ 
 
     // Stuff that has to be done regardless of success or error 
 
     }, 
 
     error: function(evt, xhr, status, error){ 
 
     // Your error messages 
 
     } 
 
    }); 
 
    } 
 
});

這樣,你得到完全控制你的表單處理流程