防御性地处理ActiveRecord :: RecordNotFound

时间:2012-05-24 15:19:15

标签: ruby-on-rails

我想知道防御性处理ActiveRecord抛出RecordNotFound异常的最佳做法是什么。似乎默认的Rails行为是呈现404错误。当我们处理获取内容时,这很好用 - 这很直观。当我正在创建类似创建关联记录的内容并且父模型的记录不再存在时,抛出404似乎更加神秘。

如果我想返回验证错误,抱怨该记录不再存在,该怎么办?我该怎么做呢?

2 个答案:

答案 0 :(得分: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,还确保它映射到真实的组记录。

# User.rb
validates_presence_of: group

这样,如果您只是将params放入.create!.save!方法,验证将失败,您将收到标准的Rails错误消息。

但是,您的控制器应该使用非异常抛出版本(.create.save),然后您可以再次执行上述操作以查看对象是否有效,然后设置闪存不是。

答案 1 :(得分:0)