Ruby on rails 何处救援网络连接错误:在模型或控制器中?

Ruby on rails 何处救援网络连接错误:在模型或控制器中?,ruby-on-rails,activerecord,applicationcontroller,Ruby On Rails,Activerecord,Applicationcontroller,我有一个模型,它要求在创建模型实例之前访问外部网站。错误恢复的最佳实践是什么?注意,因为我没有创建模型,所以我在模型中使用了类方法 挽救模型(而不是控制器)中的错误感觉是正确的,但将错误传达给控制器的最佳方式是什么?以下代码的问题是模型返回nil,因此控制器无法向用户提供任何失败提示: class MyModel < ActiveRecord::Base def self.lookup(address) begin return web_lookup(address

我有一个模型,它要求在创建模型实例之前访问外部网站。错误恢复的最佳实践是什么?注意,因为我没有创建模型,所以我在模型中使用了类方法

挽救模型(而不是控制器)中的错误感觉是正确的,但将错误传达给控制器的最佳方式是什么?以下代码的问题是模型返回nil,因此控制器无法向用户提供任何失败提示:

class MyModel < ActiveRecord::Base
  def self.lookup(address)
    begin
      return web_lookup(address)
    rescue SocketError
      return nil
    end
  end
end

class MyModelsController < ApplicationController
  def create
    info = MyModel.lookup(params[:address])
    if info
      MyModel.create(:info => info)
    else
      flash_message('cannot lookup info') # I'd like to tell the user what failed here
    end
  end
end
classmymodelinfo)
其他的
flash_message('cannotlookup info')#我想告诉用户这里失败了什么
结束
结束
结束
你将如何处理这个问题


(附言:我可以在我的模型代码中调用MyModel.new(:info=>info)并将其返回到控制器代码中。这将允许我将错误分配给模型实例[对吗?],但我不确定这是公共API的一部分。这是否可行,如果可行,您将如何编写?

在控制器中肯定会解决这个问题。控制员是交通警察,负责将交通指挥到适当的地方。与外部服务器的连接以及发生故障时相应的错误处理是流量处理的一部分,因此100%的控制器职责。

我意识到web访问应该在延迟作业或等效作业下处理,因此这将从根本上改变事物的结构。尽管如此,你的回答还是有道理的。