3

開始ブロックから抜け出してレスキュー ブロックにジャンプするにはどうすればよいですか?

def function
  begin
    @document = Document.find_by(:token => params[:id])
    next if @document.sent_at < 3.days.ago # how can I skip to the rescue block here?
    @document.mark_as_viewed
  rescue
    flash[:error] = "Document has expired."
    redirect_to root_path
  end
end

使用しようとしてもうまくいきnextません。

4

1 に答える 1

8

まあ、エラーを発生させることができます。これが begin/rescue ブロックの仕組みです。ただし、これは良い考えではありません。ビジネス ロジックにエラー処理を使用することは、一般的に嫌われています。

単純な条件としてリファクタリングする方がはるかに理にかなっているように思えます。何かのようなもの:

def function
  @document = Invoice.find_by(:token => params[:id])
  if @document.sent_at < 3.days.ago
    flash[:error] = "Document has expired."
    redirect_to root_path
  else
    @document.mark_as_viewed 
  end
end

ここでいくつかの異なる種類のブロック関連のキーワードを混同しているようです:

エラー処理 ( begin/ rescue/ end) は、何かしようとするとエラーが発生する可能性があると思われる場合に使用し、特定の方法で対応します。

next反復用です-コレクションをループしていて、次の要素にスキップしたい場合。

条件 ( ifunlesselseなど) は、何かの状態をチェックし、それに応じてさまざまなコードを実行するための通常の方法です。

于 2014-01-09T21:14:28.800 に答える