之前在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()