說例如,您有兩個用戶在查看頁面。雙擊可刪除相同的記錄。是否有'軌道'來處理這些類型的邊緣情況?如何處理破壞邊緣案例
我一直未能找出如何軌道處理這個,但我知道,默認情況下,誰以後點擊最終將記錄未找到錯誤。你怎麼能夠捕捉到這一點,並知道它是從一個已被刪除的記錄上的銷燬行動中產生的?
說例如,您有兩個用戶在查看頁面。雙擊可刪除相同的記錄。是否有'軌道'來處理這些類型的邊緣情況?如何處理破壞邊緣案例
我一直未能找出如何軌道處理這個,但我知道,默認情況下,誰以後點擊最終將記錄未找到錯誤。你怎麼能夠捕捉到這一點,並知道它是從一個已被刪除的記錄上的銷燬行動中產生的?
,檢查備案的存在將受到競爭條件的任何做法。例如。
@record = Record.find_by_id(params[:id])
if @record
# I got there first! Or did I?...
@record.destroy!
如果該記錄是由存在測試後另一個請求遭到破壞,destroy!
將引發異常。
你可以簡單地處理異常,因爲它們發生:
def destroy
@record = Record.find(params[:id])
@record.destroy!
flash[:message] = "Record was destroyed"
rescue ActiveRecord::RecordNotFound
flash[:message] = "Record was already destroyed"
rescue ActiveRecord::RecordNotDestroyed
flash[:message] = "Record was not destroyed"
end
在實踐中,通常不是理由這樣做,除非破壞可以實際發生故障都請求,例如,如果有一個回調可以防止記錄被破壞。在這種情況下,您可能需要更廣泛的錯誤處理來將失敗的原因傳達給客戶端。
對於我見過的大多數應用程序來說,僅僅在發生故障時將用戶路由回安全的地方就足夠了。
或
def destroy
@record = Record.find_by(id:params[:id])
if @record
@record.destroy!
flash[:message] = "Record is destroyed"
else
flash[:message] = "Record not found!"
end
end
,你也可以在你的application_controller.rb有這個,來處理所有這些請求,它將適用於所有資源。
rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found
private
def record_not_found
flash[:danger] = "Record not Found!"
redirect_to root_path
end
但同樣,現在你應該使用find()方法來提高的ActiveRecord :: RecordNotFound如果沒有找到記錄
我的救援已經到位,但是有一個通用的「記錄未找到!」錯誤對用戶根本沒有描述。如果您嘗試使用URL訪問不存在的文件,則會彈出完全相同的錯誤消息。如何捕捉RecordNotFound – jkeuhlen
的*源*不確定,但可能會出現「偏執狂」幫助您https://github.com/radar/paranoia –
沒有「Rails」方式;你只需要從「未找到記錄」錯誤中恢復正常。 – meagar
我可以很容易地做到這一點,但我怎麼能捕捉到「未找到記錄」的來源是試圖刪除已經被破壞的記錄? – jkeuhlen