なんでこんなGem作った?
こんにちは!合同会社イービルマーシャンズと合同会社Sampo Development代表のサンポです。
フィンランドから台湾経由で日本に来ました。
(このGemは一切Evil Martiansと関係ありません)
CurrentAttributesは有害と言われる時もありますが、より有害にできないか、という想いから今回のGem作りを始めました。
面白そうなので、もっと便利に使えるようにしました。
CurrentAttributesとは何か?
ActiveSupport::CurrentAttributesはRailsの便利機能の一つです。
グローバルで使える値を設定できるので、値を渡さないといけないことが少なくなります。
そしてリクエストごとに自動的にリセットされるので、データの漏洩も心配なし!(ほとんど心配なし, PumaやRailsにバグがある場合漏洩する可能性もあり、過去は実際にもあった)
簡単な使い方の例
# app/models/current.rb
# SuperCurrentだとこのファイル要らなくなります!
class Current < ActiveSupport::CurrentAttributes
attribute :hoge
end
module HogeService
extend self
def hogehoge
Current.hoge
end
end
class HogeController
def index
Current.hoge = "hoge"
render plain: HogeService.hogehoge
end
end
これでHogeService
にアーギュメント渡さなくてもちゃんとhogeという文字列がブラウザで表示されます。
class Current
を定義したくなかったらどうしたらいい?
Gemfile
にsuper_current
を追加したらいいです!
SuperCurrentとはなんですか?
どこでもCurrentが使えて、わざわざCurrentのテスト書かなくてもいいです!
とても便利ですね。
面倒くさいアトリビュートの指定もしなくてよくて、値をCurrentに指定すればいい!
PHPみたいでいいですね。(PHPもこれが今後使えなくなるみたいですが
Current.hello #=> エラー、NoMethodError
Current.respond_to?(:hello) #=> false
Current.hello = "hello"
Current.respond_to?(:hello) #=> true
Current.hello #=> "hello"
Current.hogeが定義されてなくてもエラーにならないようにしようかとも思いましたが、それは流石にやりすぎだと思ってここまでにしました。
今すぐ本番で使った方がいいですか?
使わない方がいいかと思います!
(こういうGemではない場合も、バージョン0.1のGemは本番で使いたくないかと思いますが)
コードが分かりにくくなると思います。使い方にもよりそうですが。
遊び程度、Proof of Conceptみたいなところであれば是非使ってください。
今後の展望は?
method_missingではなくてconfigでやったらいいかと思ってました。
両方の使い方ができるようにしてもいいかもしれない、と思ってました。
configなら定義される予定のアトリビュートを確認できる、といういい点もありますし。
(その反面、悪い点としては実際に指定しないといけない、というのがありますが)