お手伝い先で URL safe なハッシュ値がついた URL を Twitter に投稿する、という機能がありました。

URL safe なのでなんの問題もなく Twitter に投稿できそうだな。と思っていたのですが問題がありました。

URL の末尾が hyphen で終わると、 hyphen の手前までを URL として認識し、その URL でリンクが作られるので誤ったリンクとなり、クリックすると 404 Not Found になってしまいました。

この問題を解消するために、 Ruby Kaigi 2017 で具体的な使用例を見た Ruby の Refinement を使って SecureRandom.twittersafe_base64 というメソッドを定義して、 URL safe でかつ Twitter にも投稿可能なハッシュ値を生成できるようにしました。

具体的なコードはこちら。

require 'securerandom'

module SecureRandom
  module TwittersafeBase64
    refine SecureRandom.singleton_class do
      def twittersafe_base64(n=nil, padding=false)
        s = urlsafe_base64(n, padding)
        s.tr!("-", "_")
        s
      end
    end
  end
end

SecureRandom.urlsafe_base64 の出力から hyhpen を 取り除き underscore に置き換えているだけです。

これを使ってハッシュ値を生成するように変更して、 Twitter に誤ったリンクが投稿されることはなくなりました。

Refinement で手軽に Ruby の拡張が出来てすごく楽しかったし、実用的なことに使えたので満足でした。