Некоторые сообщения нельзя отправить в чате

Ошибка value too long for type character varying(1000) указывает на то, что проблема связана с отрывком. Это удивительно, поскольку технически мы ограничиваем длину отрывка в 150 символов, поэтому такой случай не должен возникать. Сначала я подумал, что это баг в нашем конструкторе отрывков, но, посмотрев на код отрывка в чате, я увидел следующее:

def build_excerpt
  # просто показываем URL, если всё сообщение — это URL, так как мы не можем делать отрывки для oneboxes
  return message if UrlHelper.relaxed_parse(message).is_a?(URI)

  # сообщения, содержащие только загрузки, лучше представлять именем файла
  return uploads.first.original_filename if cooked.blank? && uploads.present?

  # это может вернуть пустое значение для некоторых сложных случаев, например цитат, что допустимо
  PrettyText.excerpt(cooked, EXCERPT_LENGTH, strip_links: true, keep_mentions: true)
end

Быстрая отладка показала, что мы на самом деле никогда не доходим до PrettyText.excerpt, а останавливаемся на первом return. Оказывается, ??? заставляет наш код думать, что это URL:

[1] pry(main)> UrlHelper.relaxed_parse("???\ntest").is_a?(URI)
=> true
3 лайка