2010-08-04 26 views
11

在我的控制器控制器中,我使用Date.new創建一個要在我的ActiveRecord中傳遞的日期對象。提高ActiveRecord :: RecordNotFound(或任何404狀態)的無效日期

end_range = Date.new(params[:year].to_i, params[:month].to_i, params[:day].to_i).end_of_day.to_formatted_s(:db) 

與此上面的問題是,如果用戶嘗試手動更改在URL中的參數,諸如進入40一天PARAM,所述Date.new失敗(如預期)。但是,如果用戶輸入類似的內容,我寧願不會出現500錯誤,而是出現404錯誤(因爲您實際上永遠無法在一天內執行40記錄)。

我嘗試過各種條件語句(ifunless語句),以raise ActiveRecord::RecordNotFound如果失敗了,但它在運行條件(和爲此從未返回404)之前,將返回500錯誤。

有沒有人知道更好的方法來處理該問題,或者讓Date.new更優雅地失敗以便條件語句可以運行的方法?

回答

28

在這種情況下,你可能挽救一個例外,再多問,如果你想重新映射異常未辦理到那種有:

def show 
    begin 
    end_range = Date.new(...) 
    rescue ArgumentError 
    # Invalid date 
    raise ActiveRecord::RecordNotFound 
    end 
rescue ActiveRecord::RecordNotFound 
    render(:partial => 'not_found', :layout => 'application', :status => :not_found) 
end 

這可能是更有效的方法簡單地儘管呈現並失敗。

def show 
    begin 
    end_range = Date.new(...) 
    rescue ArgumentError 
    return render(:partial => 'date_not_found', :layout => 'application', :status => :not_found) 
    end 
end 

您也可以使用ApplicationController中的rescue_from方法做到這一點更廣泛的意義上:

class ApplicationController < ActionController::Base 
    rescue_from 'ArgumentError do 
    render(:partial => 'exceptions/argument_error', :layout => 'application', :status => :not_found) 
    end 
end 
+0

謝謝,這工作。第二個例子效果很好,這正是我想要的,但我開始試圖通過一個ActiveRecord NotFound來獲取500以外的內容。(如果有人讀到這個,ActiveRecord在第一個例子中是錯誤的。) – 2010-08-04 20:17:53

+0

Fixed錯字。很高興爲你工作。 – tadman 2010-08-04 20:54:18

1

我覺得它更有意義搶救無效日期錯誤提供一個有用的信息。例如,當人們選擇2月30日時,這是一個常見問題。我寧願將他們發回問題表單,並告訴他們爲什麼他們被送回。在大多數情況下,404會出錯,因爲錯誤是無效的用戶輸入,而不是無效的URL。

此外,如果您拯救所有ArgumentError s,那麼您將不會收到其他與代碼相關的錯誤的通知。所以,如果它不是日期錯誤,那麼我會重新提出錯誤。不幸的是,我們必須改變異常類型以避免循環。

我已經把這個在application_controller:

rescue_from ArgumentError do |exception| 
    if exception.message == 'invalid date' 
    flash[:error] = exception.message 
    redirect_to request.referer ? :back : root_url 
    else 
    raise StandardError, exception.message, exception.backtrace 
    end 
end 
+1

這個答案比較好,更以Rails爲導向! – caesarsol 2015-03-11 09:51:22

+1

不建議使用StandardErrors。他們太基本了,沒有解釋任何背景,只是提出了一些例外。 – maikovich 2016-08-05 08:17:05

相關問題