2016-10-05 43 views
1

鑑於RESTful API,在Rails中實現,我想在響應中不僅包含由ActiveModel::Validations生成的錯誤消息,還包含自定義錯誤代碼。首先我想指出,我不是在談論HTTP Status codes。我正在討論將任何類型的錯誤(從像record not found這樣的小錯誤到像username can't be blank這樣的小驗證錯誤)的錯誤映射到唯一的數字代碼,即自定義應用程序特定的錯誤代碼。讓我舉一個例子 - 給出的錯誤代碼的列表,如:如何在Rails API中返回自定義錯誤代碼?

1: record not found 
... some other errors 
# Validation errors for User model between 1000 to 2000 
1001: first name can't be blank 
1002: first name must contain at least 3 characters 
1003: last name can't be blank 
1004: last name must contain at least 3 characters 
...some other errors 

如果我有一個表格的用戶,並與名字和姓氏空字段提交,我想在響應正文類似:

{error_codes: [1001, 1002, 1003, 1004]} 

或類似的東西(例如,我可以具有error objects,每個陣列具有一個代碼,消息顯影劑,消息用戶等)。讓我舉與Twilio API,從RESTful API Design: what about errors?採取了一個例子:

enter image description here

在此,20003是一些自定義的Twilio特定的代碼。問題是 - 這怎麼能在Rails中實現呢?我看到幾個難點:

  • 我該如何獲得所有可能遇到的錯誤列表。即使僅僅出現驗證錯誤,也很難獲得這樣的列表,更不用說可能發生的其他類型的錯誤。
  • 該列表應該如何組織 - 可能在YAML文件中?
  • 如何訪問列表 - 可能類似於通過I18n.t訪問翻譯的方式?

我真的很感謝你對這個主題的任何建議。謝謝。

P.S.我認爲這是一個similar question

回答

1

ActiveModel內置驗證器可以找到here。有時候一個驗證器可以檢查多個事物並輸出不同的消息。根據您的猜測,最簡單的方法是查看它們的I18n yaml文件,其中可以找到here

做你想做的一種方法是用你的自定義代碼覆蓋這些消息。另一種方式是在將驗證程序明確附加到模型時傳遞自定義消息。

validates :name, message: 'code:001 - my custom message' 

雖然這兩個選項不會幫助你的結構。開箱即用的json上不會有不同的密鑰code

您可以完成該操作的一種方法是,可以創建一個幫助程序來解析錯誤消息,並在代碼分配給模型實例後提取代碼。沿着線的東西:

def extract_error_codes(error_messages) 
    error_messages.map{ |message| message.match('^code:(\d+)\s-')[1] } 
end 

這將使你的錯誤代碼的數組,該實例如果您想使用的格式code:001 - my custom message

另一個更爲複雜的方式是在驗證失敗時,使用ActiveModel的Validator類並存儲錯誤代碼。這將需要進入每個驗證器來分配代碼。