例如,假设您有两个用户正在查看某个页面。两者都单击以删除相同的记录。是否有“轨道”来处理这些类型的边缘情况?
我无法找到rails如何处理这个问题,但我知道,默认情况下,以后点击的人最终会找不到记录错误。你怎么能抓住这个并知道它来自已被删除的记录上的销毁行动?
答案 0 :(得分:1)
任何检查记录存在的方法都将受到竞争条件的影响。例如
@record = Record.find_by_id(params[:id])
if @record
# I got there first! Or did I?...
@record.destroy!
如果记录在存在测试后被另一个请求销毁,destroy!
将引发异常。
您可以简单地处理发生的异常:
def destroy
@record = Record.find(params[:id])
@record.destroy!
flash[:message] = "Record was destroyed"
rescue ActiveRecord::RecordNotFound
flash[:message] = "Record was already destroyed"
rescue ActiveRecord::RecordNotDestroyed
flash[:message] = "Record was not destroyed"
end
实际上,通常没有理由这样做,除非在两个请求中实际失败,例如,如果存在阻止记录被销毁的回调。在这种情况下,您可能需要更广泛的错误处理来将故障原因传达回客户端。
对于我见过的大多数应用程序,只要在发生故障时将用户路由回安全的地方就足够了。
答案 1 :(得分:0)
或
def destroy
@record = Record.find_by(id:params[:id])
if @record
@record.destroy!
flash[:message] = "Record is destroyed"
else
flash[:message] = "Record not found!"
end
end
你也可以在你的application_controller.rb中使用它来处理所有这样的请求,它将适用于所有资源。
rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found
private
def record_not_found
flash[:danger] = "Record not Found!"
redirect_to root_path
end
但是再次,如果找不到记录,你应该使用find()来引发ActiveRecord :: RecordNotFound