1

这适用于运行 ruby​​ 2.0.0-p353 的 rails 4.0.2 应用程序。

我有一个具有以下方法的助手

def render_feed_row(activity_item)
  begin
    if activity_item.type == "comment"
      render "newsfeed/comment", :item => activity_item
    elsif activity_item.type == "post"
      render "newsfeed/post", :item => activity_item
    else
      raise NameError
    end
  rescue NameError => e # note: NoMethodError is a subclass of NameError
    render "newsfeed/other", :item => activity_item
  end
end

但是如果 aNoMethodError在部分中被提出newsfeed/post,它不会被这个助手捕获。这是为什么?它不渲染newsfeed/other,它实际上引发了一个异常。

4

2 回答 2

2

我刚刚检查了您的代码的简化版本,它工作正常。

def render_feed_row
  raise NoMethodError
rescue NameError
  puts "kaboom"
end

render_feed_row
# => kaboom

但是,请注意,以这种方式对控制流使用异常是一种非常糟糕的做法。此外,如果你真的想使用异常,你应该创建自己的类,而不是在 Ruby 程序中使用NoMethodErrorNameError具有特定含义的类。

这是您方法的更干净的版本

def render_feed_row(activity_item)
  case (type = activity_item.type)
  when "comment", "post"
    render "newsfeed/#{type}", item: activity_item
  else
    render "newsfeed/other", item: activity_item
  end
end

或者更简洁的版本

def render_feed_row(activity_item)
  name = case activity_item.type
  when "comment", "post"
    activity_item.type
  else
    "other"
  end
  render "newsfeed/#{name}", item: activity_item
end
于 2013-12-16T10:04:22.030 回答
0

对控制流使用异常很慢。为什么不只是:

def render_feed_row(activity_item)
  partial = ['comment', 'post'].include?(activity_item.type) ? 
                                                    activity_item.type : 'other'

  render "newsfeed/#{partial}", :item => activity_item
end
于 2013-12-16T09:59:40.733 回答