2010-10-14 95 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