TypeError: no implicit conversion of Capybara::ElementNotFound into String

TypeError: no implicit conversion of Capybara::ElementNotFound into String

我有一些非常基本的代码:

  def select_author_name(comment)
    selector = 'span.name'
    comment.find(selector).text
  rescue Capybara::ElementNotFound => e
    Rails.logger.warn('Could not get author_name: ' + e)
    puts e
    ''
  end

当我 运行 这段代码并成功挽救 Capybara::ElementNotFound 错误时,它会爆炸并出现以下错误:

TypeError: no implicit conversion of Capybara::ElementNotFound into String

奇怪的是puts e行会打印出错误没问题

我的问题是:

当我可以用 puts 成功打印出 e 时,为什么连接尝试会导致打印 e 出现问题?两者不会导致 .to_s 暗中调用吗?

Ruby 在连接字符串时实际上使用隐式 #to_str 方法,而不是 #to_s.

在这种情况下,最简单的解决方案可能是将您的代码更改为:

Rails.logger.warn('Could not get author_name: ' + e.to_s)

如果你出于某种原因想要避免这种情况,并且希望所有错误对象在将来进行字符串连接时都按照你的预期运行,你也可以打开 StandardError class并定义 to_str:

class StandardError
  def to_str
    self.to_s
  end
end