【发布时间】:2019-03-29 04:00:36
【问题描述】:
我有一个模型,它是我的 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按钮,触发ShippingLabelsController中的:new动作,预填表单并触发创建标签的延迟作业的:perform动作。并且错误发生在作业开始后。
【问题讨论】:
-
你在哪里称呼“find_order”?您可以在该调用周围添加一个开始/救援语句以捕获 ResourceNotFound 说明
-
“我如何通知用户” - 用户首先如何获得此方法?
-
用户尝试为订单创建运输标签并在后台进入此方法
-
那么,正如 arieljuod 所说,您可以在运输标签控制器中进行救援。例如,
rescue_from在控制器级别。或begin/rescue在动作正文中。 -
perform方法在哪里被调用?您需要提供触发该代码的请求的上下文,如果您不解释完整的流程“用户尝试创建运输标签”不清楚,则不可能提出任何建议,什么控制器/操作/代码由触发用户的那个动作?
标签: ruby-on-rails