2016-06-15 499 views
0

我正在使用ajax提交我的註冊表單。我應該擔心這個422(Unprocessable Entity)錯誤嗎? (Rails&Devise)

enter image description here

提交正確時,信息是正確的形式。如果細節錯誤,我也能夠正確捕獲錯誤。但是,如果信息有誤,我也可以看到POST http://localhost:3000/users 422 (Unprocessable Entity)錯誤消息對我的控制檯日誌:

enter image description here

我的問題是,我應該擔心這個錯誤?或者這是正常的? 如果這不正常,我該如何正確處理它?

謝謝!

################################ UPDATE ############ ##################從終端

錯誤消息:

Started POST "/users" for ::1 at 2016-06-15 09:20:20 +0100 
Processing by RegistrationsController#create as JSON 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"0D1qSK8IfbuefQ0bwEdKQFD+6WZ8XJtCnl2FZ6Nln9khLtv6qYCmoTKhwBFkVIJdYXSRQJ4e+9QAAdJ5UJzukQ==", "user"=>{"first_name"=>"John", "last_name"=>"Doe", "email"=>"[email protected]", "password"=>"[FILTERED]"}, "commit"=>"Sign up"} 
    (0.2ms) BEGIN 
    User Exists (0.6ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY '[email protected]' LIMIT 1 
    (0.2ms) ROLLBACK 
Completed 422 Unprocessable Entity in 93ms (Views: 0.4ms | ActiveRecord: 1.1ms) 

註冊控制器:

class RegistrationsController < Devise::RegistrationsController 
    respond_to :json 

    def create 
    super 
    end 
end 

周的application.js:

$(function(){ 

    $("form#ajax_signup").submit(function(e){ 
    e.preventDefault(); 
    var user_info = $(this).serializeObject(); 
    console.log("About to post to /users: " + JSON.stringify(user_info)); 
    $.ajax({ 
     type: "POST", 
     url: "http://localhost:3000/users", 
     data: user_info, 
     success: function(json){ 
     console.log("The Devise Response: " + JSON.stringify(json)); 
     }, 
     error: function(xhr) { 

      var errors = jQuery.parseJSON(xhr.responseText).errors; 

      for (messages in errors) { 
       error_messages = messages + ' ' + errors[messages]; 

       console.log(error_messages); 
      } 

     }, 
     dataType: "json" 
    }); 
    }); 

}); 
+1

難道你把相關日誌條目的其餘部分,並在控制器方法負責(包括使用的任何強大的PARAMS方法)。 – Matt

+0

是的,當然你應該關心,當然由於某種原因,這個POST操作失敗(「收到電子郵件地址」)會返回一些4xx響應。你能指望什麼?你只是想做客戶端驗證?即使如此,你應該處理在任何情況下由服務器發送的錯誤響應... – matthias

+0

@Matt我已經發布了一些關於該問題的更多詳細信息 –

回答

0

不,你不要在控制檯擔心422,這個紅色的警告不會打破你的JavaScript代碼。 但這個錯誤可以爲您提供方便的驗證處理在你的JavaScript代碼,如:

$('#form').on('ajax:error', 
    function() { return 'handle me'; } 
); 
+0

啊是的。我只是想知道,因爲當我查看像Airbnb這樣的網站(我相信他們使用AJAX處理他們的註冊表單)時,當表單失敗時,沒有422錯誤或任何其他錯誤。他們不應該假設顯示像我一樣的錯誤嗎?或者有一種方法可以正確處理這個問題 –

+0

有兩種方法可以處理驗證:第一種:第一種:第二種:第二種:200(ok)+錯誤:{name:'cant be blank'}'in a body。在第一種方式中,您可以檢查狀態代碼,在第二種情況下,您應該檢查錯誤密鑰存在 – itsnikolay

+0

@itsnikolay這是真的,並且可能有些大型服務會像這樣處理它(此外還會執行大量預取數據檢查可用性,做一些「預測性」客戶端驗證)。但是,儘管如此,如果客戶端發送的數據無法以可以成功創建或更新實體的方式進行處理(POST,PUT,PATCH ...),那麼返回4xx(客戶端錯誤)代碼的方式會更加REST風格。 )。 – matthias

相關問題