2012-05-24 56 views
0

我想知道什么是防守处理ActiveRecord抛出RecordNotFound异常的最佳做法。看来默认的Rails行为是呈现404错误。当我们处理获取内容的时候,这很好,这很直观。当我做一些事情就像创建一个关联的记录并且父模型的记录不再存在一样时,抛出一个404似乎更加神秘。防御处理ActiveRecord :: RecordNotFound

如果我想要,而是返回验证错误,抱怨该记录不再存在,该怎么办?我该如何去做这件事?

+0

你能给当AR :: RecordNotFound被提出,我们在调用Ruby代码的例子吗? –

回答

2

你应该在你的网站上永远不会出现404错误:你应该尝试捕捉所有的错误并妥善处理它们。

这取决于你在哪里得到的错误。如果你在一个控制器中,比如在编辑动作中,你可以使用一个救援,或许与.exists?一起使用,这样就不会发生任何错误。类似这样的:

def edit 
    if Model.exists?(params[:id]) 
     @model = Model.find(params[:id]) 
    else 
     flash[:error] = "Unable to find model with ID #{params[:id]}!" 
     redirect_to models_path 
    end 
end 

您也可以为此添加模型级别验证。假设你有一个属于一个组的用户(即它有一个group_id)。该验证将确保不仅设置了group_id,而且还确保它映射到真实的Group记录。

# User.rb 
validates_presence_of: group 

这样,如果你只是扔在PARAMS的.create!.save!方法,验证将失败,你会得到一个标准的Rails错误消息。但是,您的控制器应该使用非异常投掷版本(.create.save),并且您可以再次执行上述操作来查看对象是否有效,如果不是,则设置闪烁。

+0

我不确定存在验证是好主意,因为它依赖于空白?在parent_id变为不存在的id时可以存在的关联上。没有? –

+2

如果你做了'validates_presence_of:group_id',那么它只会确保你输入了一个ID号码,即使它是无效的。也就是说,您可以使group_id = -1并验证会很高兴。然而,'validates_presence_of:group'不仅会确保您必须拥有一个ID(因此它不能为零),而且该ID与真实记录匹配(所以group_id = -1将失败)。 – MrDanA

相关问题