我想知道防御性处理 ActiveRecord 引发 RecordNotFound 异常的最佳做法是什么。似乎默认的 Rails 行为是呈现 404 错误。当我们处理获取内容时,这很有效——这很直观。但是,当我正在执行诸如创建关联记录之类的操作并且父模型的记录不再存在时,抛出 404 似乎更加神秘。
相反,如果我想返回一个抱怨记录不再存在的验证错误怎么办?我该怎么做呢?
我想知道防御性处理 ActiveRecord 引发 RecordNotFound 异常的最佳做法是什么。似乎默认的 Rails 行为是呈现 404 错误。当我们处理获取内容时,这很有效——这很直观。但是,当我正在执行诸如创建关联记录之类的操作并且父模型的记录不再存在时,抛出 404 似乎更加神秘。
相反,如果我想返回一个抱怨记录不再存在的验证错误怎么办?我该怎么做呢?
您真的不应该在您的网站上出现 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
这样,如果您只是将参数放入.create!
or.save!
方法中,验证将失败,您将收到标准的 Rails 错误消息。
但是,您的控制器应该使用非异常抛出版本(.create
和.save
),您可以再次执行上述操作以查看对象是否有效,如果不是,则设置闪光灯。
使用 validates_existence gem https://github.com/perfectline/validates_existence