はじめに
Slack通知に便利なgem「slack-notifier」がRuby3に対応してなかった。
バグ通知とか便利だからこれがないと困る。
pingメソッドを実行すると
ArgumentError (wrong number of arguments (given 2, expected 1))
しょうがないからモンキーパッチを当てて対応した。
極力モンキーパッチしたくないけど、gem壊れてたらしょうがないよね。
前提
Rails 6.1.0
Ruby 3.0.0
slack-notifier 2.3.2
※2021年3月12日現在までは動くことを保証してますが、
それ以降は自己責任でお願いします。
説明すること
- slack-notifierが動かなくなった理由
- 対応方法
slack-notifierが動かなくなった理由
Ruby 3で、キーワード引数が通常の引数とは独立した引数になったことが原因みたい。
Ruby 3ではこんな感じで引数を入れてあげないとErrorになるらしい。
# キーワード引数を受け取るメソッド
def foo(key: 42)
end
foo(key: 42) # OK: キーワード引数を渡している
opt = { key: 42 }
foo(opt) # NG: 普通の引数を渡しているのでエラー(2.7では警告付きで動いていた)
foo(**opt) # OK: ハッシュを明示的にキーワードに変換している
参照:https://techlife.cookpad.com/entry/2020/12/25/155741
この変更のせいで「Slack::Notifier::Util::LinkFormatter」がお亡くなりになったようです。
対応方法
モンキーパッチをしてあげましょう。
モンキーパッチって何?
ソースを直接いじらず、RailsとかGemとかの外部モジュールを変更すること。
wikipediaにはこんな感じで書いてる
モンキーパッチは、オリジナルのソースコードを変更することなく、実行時に動的言語(例えばSmalltalk, JavaScript, Objective-C, Ruby, Perl, Python, Groovy, など)のコードを拡張したり、変更したりする方法である。
参照:https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%82%AD%E3%83%BC%E3%83%91%E3%83%83%E3%83%81
実際のソース
require 'slack-notifier/version'
unless Slack::Notifier::VERSION == '2.3.2'
raise 'Consider removing this patch'
end
module MonkeyPatches::SlackNotifier
def initialize string, opts = {}
@formats = opts[:formats] || %i[html markdown]
@orig = string.respond_to?(:scrub) ? string.scrub : string
end
end
Slack::Notifier::Util::LinkFormatter.prepend(MonkeyPatches::SlackNotifier)
Dir[Rails.root.join('lib/monkey_patches/*.rb')].sort.each do |file|
require file
end
参照
[Gemにモンキーパッチを当てるサンプル
] (https://qiita.com/ham0215/items/96726d73a563ae8a4c60)