我有一个模型,它是我的Rails应用程序和API之间的桥梁,并且没有控制器和视图。
在以下方法中,我得到一个错误,这是一个ActiveResource::ResourceNotFound
错误。
def find_order(order_id, cached: false)
within_temp_session do
order = find_cached_order(order_id) if cached
unless order
order = API::Order.find(order_id) # here the order can be absent
cache_order(order.attributes)
end
order
end
end
从各种角度来看,我的想法都不好,例如在模型中调用控制器方法违反了MVC概念。
编辑:redirect_to
,flash[:alert]
和errors.add error
一样自然不起作用。
使用attr_accessor
有助于向模型实例添加错误,但是我在任何地方都不使用模型实例。
如何通知用户发生错误?
这是回溯:
10 File "/app/app/models/model1.rb", line 24 in block in find_order
11 File "/app/app/models/model1.rb", line 97 in block in within_temp_session
+ 1 non-project frame
13 File "/app/app/models/model1.rb", line 97 in within_temp_session
14 File "/app/app/models/model1.rb", line 21 in find_order
15 File "/app/app/models/model2.rb", line 76 in find_order
16 File "/app/app/models/model3.rb", line 45 in order
17 File "/app/app/models/model3.rb", line 69 in build_call
18 File "/app/app/models/model3.rb", line 50 in shipping_label_form
19 File "/app/app/models/model3.rb", line 55 in create_label
20 File "/app/app/jobs/job.rb", line 8 in block in perform
+ 2 non-project frames
23 File "/app/app/jobs/job.rb", line 7 in perform
编辑2:
用户单击get shipping label
按钮,这将触发:new
中的ShippingLabelsController
操作,这将预填充表单并触发:perform
延迟作业的操作以创建标签。并且错误发生在作业开始之后。
答案 0 :(得分:0)
SomeJob.perform_later
触发异步作业。我们不知道什么时候完成。因此,是的,要通知用户错误是很难的。但是是否需要通知用户?
关于排队作业的好处是,如果它们失败,则可以再次尝试。然后再次。再一次,直到他们工作或你放弃。使用API时,API和网络会暂时出现错误,这些错误会自行解决。请勿打扰用户。
ActiveJob has retry_on
告诉作业要重试哪些异常。
class SomeJob < ApplicationJob
retry_on ActiveResource::ResourceNotFound
...
end
现在,如果API失败,您的工作将安静地重试。
ActiveResource::ResourceNotFound
是一个相当粗糙的异常,可能由于多种原因而发生,因此您最终将希望在模型中捕获并抛出更具体的异常,以微调您的错误处理。
重试次数有限制。如果重试次数已用完,则需要人工介入并找出问题所在。那个人不是用户,他们不知道如何解决它,而是管理员。
当retry_on
用尽所有尝试时,异常将冒泡到基础排队系统,然后该队列系统应通知管理员队列中有无效项目。详细信息取决于您使用的排队系统。
如果确实需要通知用户,则有多种选择。一种是向用户模型添加一系列错误。用户界面会弹出,并显示用户错误数组中的所有错误,可能是一闪而过。
然后将用户传递到作业中。如果作业有任何错误,它们将被捕获并添加到其关联的用户的错误数组中。下次用户使用您的UI时,他们会看到错误。