【问题标题】:Catching exceptions in a render call from a rails helper从 rails helper 捕获渲染调用中的异常
【发布时间】:2013-12-16 09:02:09
【问题描述】:

这适用于运行 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

但是如果在newsfeed/post 部分中引发了NoMethodError,则它不会被此帮助程序捕获。这是为什么?它不渲染newsfeed/other,它实际上引发了一个异常。

【问题讨论】:

  • 奇怪的是,我在引发 NameError 异常时发现了 NoMethodError。请向我们展示NoMethodError.superclass 环境中的输出
  • 有趣...由于“nil:NilClass 的未定义方法 `display_name'”,我收到“Users::Profile#transactions_log 中的 NoMethodError”
  • 我认为你应该指定类似rescue NameError, NoMethodError => e?它将允许在当前命名空间中捕获 NoMethodError
  • 好主意。我刚试过,但没有用:(
  • 只是将rescue NoMethodError 放在附加行中?

标签: ruby-on-rails ruby ruby-on-rails-4 activeview


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    def render_feed_row(activity_item)
      partial = ['comment', 'post'].include?(activity_item.type) ? 
                                                        activity_item.type : 'other'
    
      render "newsfeed/#{partial}", :item => activity_item
    end
    

    【讨论】:

      猜你喜欢
      • 2016-12-10
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多