1

率直に言って、タイトルにあるものがおそらく不可能であることはわかっていますが、より良いものを思いつくことができませんでした.

私の問題は、ActiveRecord を使用してデータを取得/保存するのではなく、Web サービスを介して専用の API を使用していることです。そのため、そこから発生するいくつかの例外 (メールの送信など) を処理する必要がありますが、コードの冗長性を避けるためにモデルで処理したいと考えています。これまでに思いついた唯一のアイデアは、この Web サービスからの特定の応答に対して例外を発生させ、アプリケーション コントローラーで適切なアクションを生成することです。残念ながら、私のアクションの 1 つは、エラーを生成した 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 に答える