使用此控制器/模型设置如何显示错误?
我有一个创建方法,该方法调用模型中的一个方法来 ping 一些第三方 API。
我需要做的是,如果 API 发回特定消息,那么我会显示错误。
下面是我当前的控制器和模型设置,那么我如何将错误返回到控制器(以及最终的视图)?
这是我的控制器中的方法:
def create
@number = Number.where(:tracking => params[:number][:tracking], :user_id => current_user.id).first
if @number.blank?
@number = Number.new
@number.tracking = params[:number][:tracking]
@number.user_id = current_user.id
@number.notes = params[:number][:notes]
@number.track
end
respond_with(@number) do |format|
format.html { redirect_to root_path }
end
end
这是我的模型中的方法:
def track
create_events
end
def create_events(&block)
tracker = fedex.track(:tracking_number => number)
if tracker.valid?
self.assign_tracker(tracker)
tracker.events.each do |e|
self.create_event(e) unless (block_given? && !block.call(e))
end
save
else
# NEED TO THROW THE ERROR HERE
end
end
I have a create method that calls a method in a model that pings some third-party APIs.
What I need to do is if the API sends back a certain message, then I'd display an error.
Below is my current controller and model setup, so how would I get the error back in to the controller (and ultimately the view)?
Here is the method in my controller:
def create
@number = Number.where(:tracking => params[:number][:tracking], :user_id => current_user.id).first
if @number.blank?
@number = Number.new
@number.tracking = params[:number][:tracking]
@number.user_id = current_user.id
@number.notes = params[:number][:notes]
@number.track
end
respond_with(@number) do |format|
format.html { redirect_to root_path }
end
end
Here are the methods in my model:
def track
create_events
end
def create_events(&block)
tracker = fedex.track(:tracking_number => number)
if tracker.valid?
self.assign_tracker(tracker)
tracker.events.each do |e|
self.create_event(e) unless (block_given? && !block.call(e))
end
save
else
# NEED TO THROW THE ERROR HERE
end
end
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您不抛出错误,而只使用验证,怎么样?类似以下内容(只是为了开始。这需要工作。):
然后在您的控制器中:
或者您可以将其作为验证的一部分来执行(因此调用 < code>valid? 将按预期工作,不会破坏您的自定义“跟踪”错误)
请注意,在后一种情况下,您必须稍微更改逻辑,只需传递跟踪号并尝试保存新的记录,这将触发跟踪尝试。
How about if rather than throwing errors, you just use validation? Something like the following (Just to get your started. This would need work.):
Then in your controller:
Alternatively you could do this as part of validation (so calling
valid?
would work as expected and not destroy your custom "track" errors)Note in the latter case you'd have to change your logic a bit, and simply pass the tracking number and attempt to save a new record, which would trigger the tracking attempt.
您通常应该将 API 调用卸载到后台作业,并且可以使用通知程序(或 Rack 中间件)来引发自定义错误并相应地处理它们。
You should typically offload the the API calls to a background job and you could either use notifiers (or Rack middleware) to raise self-defined errors and handle them accordingly.