救援网络连接错误的位置:在模型或控制器中?

时间:2011-07-08 15:30:04

标签: ruby-on-rails activerecord applicationcontroller

我有一个模型,需要在创建模型实例之前访问外部网站。什么是错误恢复的最佳做法?请注意,由于我没有创建模型,我在模型中使用了类方法。

在模型(而不是控制器)中挽救错误感觉是正确的,但那么将错误传达给控制器的最佳方法是什么?以下代码的问题是模型返回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

你会怎么做?

(PS:我可以在我的模型代码中调用MyModel.new(:info =&gt; info)并将其返回给控制器代码。这样我就可以为模型实例分配一个错误[对吧?],但是我不确定这是公共API的一部分。这会起作用,如果是的话,你会怎么写呢?)

1 个答案:

答案 0 :(得分:1)

绝对在控制器中解救。控制器是交通警察,负责将交通引导到适当的地方。与外部服务器的连接以及故障时相应的错误处理是流量处理的一部分 - 因此100%的控制器职责。