RailsでもRubyのStringクラスに翻訳機能をつけてしまった(Rails 7でも対応)


何ができるようになった?

'Maybe I should just write articles on Qiita in English and translate them in Rails console using ActiveTranslateSelf'.translate_to_ja
#  "英語でQiitaの記事を書いて、ActiveTranslateSelfを使ってRailsのコンソールで翻訳すればいいのかもしれません。"

Rubyの文字列をRailsのコンソールの中で訳せるようになっています!
基本的にRailsの中であればどこでも使えます!Callback設置して、Sidekiqで翻訳のジョブ設置してもよし、翻訳ファイルの更新スクリプトの中で使ってもよし!

Rails Engineとは?

Railsの中にあるRailsのアプリ、ということで言えばいいでしょうか。
今回はRailsのConfigとLoadHookを使いたかったので、Engineとして作りました。
コマンドはいかです

$ rails plugin new ActiveTranslateSelf --mountable

mountableというオプションがないとRailtieになります。

ハマったところ

Engineのコンフィグレーションについていろいろ読んでいて、
何回試してもうまくいかない・・・ということでしたが、
今回はDeepLの設定をInitializerを読み込んでから読み込まないといけないというところで積んでいました。

あとでActiveRecordにもちょっとした機能いれようかと思っているため

ActiveSupport.on_load(:active_record) do
end

で行きました。このあたりはちゃんとRailsの実装を見て勉強しないといけないと思っています。

Rails 7対応かどうか確認しよう!

RailsのEdgeだとすでにRails 7のAlphaが使えます!
これを以下のようにGemfileに記載すれば、今でも試せます

gem 'rails', github: 'rails/rails', branch: 'main'

さすがはブランチ名もMainになっていますね。
個人的にすごいといころは、ActiveRecord::Encryptionがすでに使えるということかと思います。
Railsエンジニアの憧れとしてもEdgeで走っているプロジェクト、というのはあるかと思います。
(Github, Shopifyはそれを実践しています)

Github Actionsで簡単にいろんなRailsのバージョンに対してテストも走らせて、すごく便利です。
ただしRails 5.2はRuby 3.0非対応なため、そこはもう5.2テスト対象として落とすべきか悩ましいところです。

strategy:
      matrix:
        ruby: [2.7]
        bundler: [default]
        gemfile:
          - rails_5.2
          - rails_6.0
          - rails_6.1
          - rails_master

このようにStrategyを指定するとテストもラクチンです!

今回のGem
https://rubygems.org/gems/active_translate_self

ソース
https://github.com/sampokuokkanen/ActiveTranslateSelf/