smellman's Broken Diary

クソみたいなもんです

2022/05/24の日記 - Redmine 5 PluginにおけるAbstractController::ActionNotFoundの対応とか

朝は適当に起きてから、途中まで調べていたRedmine 5 PluginにおけるAbstractController::ActionNotFoundの対応をしていた。

何が起こったのか。

まず、RedmineのPluginで既存のcontrollerの上書きをするコードは動いていた。

https://github.com/gtt-project/redmine_gtt/blob/main/lib/redmine_gtt/patches/projects_controller_patch.rb#L6

このコードでindexやshowの上書きは正しくできているのだけど、元のメソッドになかったupdate_gtt_configurationと言うアクションに対してはAbstractController::ActionNotFoundが吐かれていた。

これはdevelopmentでは再現せず、productionのみ発生するものであった。

github.com

元のチケットに書いてあるように、ProjectsControllerをnewしてやるとメソッドが見えているため、何かがおかしかった。

そこで、今回はAbstractController::ActionNotFoundをhookするためにaction_missingを実装して、その中でupdate_gtt_configurationへのアクセスの時にはそちらに処理を回すようにした。

      # Zeitwerk tweek
      def action_missing(action_name, *args)
        if action_name == 'update_gtt_configuration'
          self.update_gtt_configuration
        end
      end

これで無事通るのを確認できた。

ポイントとしてはRedmine 5からRails 6ベースとなっており、Zeitwerkが使われるようになっていたという点です。

これがキャッシュをしてくれるのは便利なんだけど、既存のメソッド以外のメソッドの追加となると対応してくれないという問題があったというのが今回の結論。

そのため、既存のメソッドであるaction_missingを使う事で無事対処できた。

Railsは奥が深いですね。

あとは、仕事のdocker compose環境でsmtpにmailcatcherを導入したり。

MailCatcher

Docker imageを作ってる人がいたけど、バージョンが古くなっていたのでPull Requestを投げたり。

github.com

mailcatcherのdocker imageは手元でも作ってあって、皆さん是非お使いください。(Upstreamのものはバージョンが古かったりします)

https://hub.docker.com/r/smellman/mailcatcher

なにげにamd64とarm64に対応しています。

あと、開発環境をRedmine 5.0.1に上げたり、いろいろやりました。

というわけで今日は開発三昧でした。

ではでは。