やわらかテック

興味のあること。業務を通して得られた発見。個人的に試してみたことをアウトプットしています🍵

Rails Discussionに投稿をしてみた

「今年こそは...今年こそは...OSSに貢献するぞ...!」と思い気づけはや3年。
気持ちだけが先行して何をしたら良いのか分からず。結局、それらしいことは何もしていませんでした。
ですが、先日開催されたRubykaigi2023(コロナになって行けなかったけど)へ参加した方のツイートや、参加レポートを見て何かOSSに貢献できればなぁ...と改めて感じました。

product.st.inc

言ってみれば業務でよく書くRubyもRailsも誰かが日夜、メンテナンスしてくださっているお陰で僕は飯が食べられています。本当に感謝しかありません。よく「〇〇言語はイケてない」だの「gemがメンテナンスされてない」...だの文句を言うだけの人がいますが、なら貢献すれば良いんじゃないのと思ってしまいます。そういったクレーマーにはなりたくありません。

...と日々、思いつつコードを書いているとRailsで気になる挙動を確認しました。

cache storeの設定値

先日、RailsにてRedisをcache storeとして使えるように設定を書き換えました。
ローカル環境では問題なく挙動が確認できたのですが、開発環境のみRedisへの書き込みに失敗する現象を確認しました。

# config/environments/development.rb
config.cache_store = :redis_cache_store, {
  url: ENV.fetch('CACHE_REDIS_URL'),
  pool_size: ENV.fetch('CACHE_REDIS_POOL_SIZE', 5),
  :
}

設定値も同じで何がダメなのか...思い悩まされた結果、環境変数の値が指定されていると取得された値がString型となり、String型のまま設定値が登録されてしまうというのが原因だという答えに辿り着きました。以下のようにStringとFloatでは+演算子は使うことが出来ない旨のエラーが表示されています。

[1] pry(main)> Rails.cache.write("/foo", "bar")
/usr/local/bundle/gems/connection_pool-2.3.0/lib/connection_pool/timed_stack.rb:67:in `+': String can't be coerced into Float (TypeError)

環境変数から読み取った値がString型になるのは当然のことなので、to_iを使ってInteger型に変換してあげれば良いのですが、そもそも設定値を指定した時点でエラーにならずString型の値がそのまま設定値として記録出来るという挙動に違和感を感じました。

config.cache_store = :redis_cache_store, {
  url: ENV.fetch('CACHE_REDIS_URL'),
  pool_size: ENV.fetch('CACHE_REDIS_POOL_SIZE', 5).to_i,
  :
}

エラーが初めて確認出来るのは実際にキャッシュを書き込んだ時です。
後にエラーとなることが自明なため、設定値を登録している際にエラーが出て欲しいなと感じました。

Rails Discussionに投稿

ということで、この挙動に対しての違和感は自分だけなのか、他の方がどう思うのか気になったのでRailsのコントリビュートガイドに従ってRuby On Rails Discussionにトピックを作成してみました。
英語の壁はありましたが、日本語で書いた原文をChatGPTに協力してもらいながら翻訳しました。

discuss.rubyonrails.org

Contributing to Ruby on Rails — Ruby on Rails Guides

誰からも返信がなければ「それってあなたの感想ですよね」という烙印が押されることになります。
ワクワクする気持ちもありますが、誰からも反応がなかったら嫌だな...とネガティブな気持ちもあります。
ただ、今までの自分がやってこなかったことにチャレンジしたことを誇らしく思います。

進捗についてはまた後日、別の記事にて共有させてください。どうなるのか楽しみです。