1

坦率地说,我知道标题中的内容可能是不可能的,但我想不出更好的东西。

我的问题是我没有使用 ActiveRecord 来获取/保存数据,而是通过 web 服务使用一些专用的 api。因此,我需要处理一些来自它的异常(例如发送邮件),但我想在模型中这样做以避免代码中的冗余。到目前为止,我想出的唯一想法是针对来自此 Web 服务的某些响应引发异常,以在应用程序控制器中生成正确的操作。不幸的是,我的一项操作是发送电子邮件,其中包含来自网络服务的请求和响应,这会产生错误。问题是,我怎样才能将它们传递给控制器​​?

4

1 回答 1

0

一般来说,使用异常来处理程序流被认为是不好的做法(但哦,太方便了!=P)。

与其尝试将控制从模型显式转移到控制器,不如将一个块传递给模型,并使用 yield 来执行该块。这样,当模型希望运行时,您可以在模型中执行来自控制器的代码。

hello = "hello"
def func
   goodbye = "goodbye"
   yield
end

func {hello = "world"}

puts goodbye

NameError: undefined local variable or method `goodbye' for #<Object:0x7fa85b7322a0>
    from (irb):25
    from :0

puts hello
"world"

这是一个将代码传递给函数的示例,并显示此代码块仍然可以从调用者访问变量(hello == "world" 从调用者的堆栈空间中,但从函数内部运行)。我觉得它更干净。

再见只是为了表明一旦函数结束,函数中定义的变量就会从堆栈中弹出。

于 2011-07-26T11:04:03.723 回答