2014-07-09 77 views
0

說例如,您有兩個用戶在查看頁面。雙擊可刪除相同的記錄。是否有'軌道'來處理這些類型的邊緣情況?如何處理破壞邊緣案例

我一直未能找出如何軌道處理這個,但我知道,默認情況下,誰以後點擊最終將記錄未找到錯誤。你怎麼能夠捕捉到這一點,並知道它是從一個已被刪除的記錄上的銷燬行動中產生的?

+0

沒有「Rails」方式;你只需要從「未找到記錄」錯誤中恢復正常。 – meagar

+0

我可以很容易地做到這一點,但我怎麼能捕捉到「未找到記錄」的來源是試圖刪除已經被破壞的記錄? – jkeuhlen

回答

1

,檢查備案的存在將受到競爭條件的任何做法。例如。

@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 

在實踐中,通常不是理由這樣做,除非破壞可以實際發生故障都請求,例如,如果有一個回調可以防止記錄被破壞。在這種情況下,您可能需要更廣泛的錯誤處理來將失敗的原因傳達給客戶端。

對於我見過的大多數應用程序來說,僅僅在發生故障時將用戶路由回安全的地方就足夠了。

0

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如果沒有找到記錄

+0

我的救援已經到位,但是有一個通用的「記錄未找到!」錯誤對用戶根本沒有描述。如果您嘗試使用URL訪問不存在的文件,則會彈出完全相同的錯誤消息。如何捕捉RecordNotFound – jkeuhlen

+0

的*源*不確定,但可能會出現「偏執狂」幫助您https://github.com/radar/paranoia –