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

好吧,你可以提出一个错误。这就是开始/救援块的工作方式。不过,这不是一个好主意——对业务逻辑使用错误处理通常是不受欢迎的。

似乎将重构为简单的条件会更有意义。就像是:

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 回答