2010-10-14 98 views
1

奇怪的是,我很難找到關於rails中基本錯誤處理的好文檔。我會很感激在處理錯誤的任何良好的聯繫,以及思想在這樣一個非常基本的方法:在rails中處理錯誤

def self.get_record(id) 
    People.first(:conditions => ["id = ?", id]) 
    end 

1)我可以確認ID =零,而且它的數字!

2)我也可以驗證記錄是否被找到。

還有別的嗎?

#1和#2都推薦練習嗎?在這兩種情況下,您是否會簡單地創建帶有錯誤的閃光消息並顯示它,或者是否泄露了太多信息?

回答

3

我相信你知道,這就像People.find(id),只是find產生了一個錯誤。

但是,如果沒有找到記錄,則People.find_by_id(id)返回nil,我懷疑這些記錄會照顧到您需要的所有內容。你不需要檢查你放入ActiveRecord的內容是否是正確的數據類型等;它處理SQL注入風險,因此提前檢查不會影響實際行爲。

如果我們只是希望在show動作,不過,有一個更優雅的方式:而不是使用find_by_id和檢查零,使用find,讓一個錯誤的泡沫了,讓控制器捕獲它rescue_from 。 (默認情況下,在生產,ActiveRecord::RecordNotFound將被捕獲並通過顯示一個通用的404救出,但如果需要,你可以自定義這種行爲。)

class UsersController < ApplicationController 
    rescue_from ActiveRecord::RecordNotFound, :with => :not_found 

    def show 
    @user = User.find params[:id] 
    end 

    protected 
    def not_found 
     flash[:error] = "User not found" 
     redirect_to users_path 
    end 
end 

未測試的代碼,僅供參考)

0

唐「做T閃光燈[:通知]的只是insted的說法是「沒有找到記錄」

由你所需要的兩件事情可以做如下:

1)我可以確認ID =零,並且它是數字。

def self.get_record(id) 
    People.first(:conditions => ["id = ?", id]) if id.integer? unless id.blank? 
end 

2)我也可以驗證記錄是否被找到。

def self.get_record(id) 
    @people = People.first(:conditions => ["id = ?", id]) if id.integer? unless id.blank? 
    flash[:notice] = @people.blank? # this will print true/false depending on value in @people 
end 

希望它適合你。 :D