LoginSignup
0
0

More than 1 year has passed since last update.

RailsのCurrentAttributesをより有害にするGemを作ってみた

Last updated at Posted at 2022-11-29

なんでこんなGem作った?

こんにちは!合同会社イービルマーシャンズと合同会社Sampo Development代表のサンポです。
フィンランドから台湾経由で日本に来ました。
(このGemは一切Evil Martiansと関係ありません)

CurrentAttributesは有害と言われる時もありますが、より有害にできないか、という想いから今回のGem作りを始めました。

面白そうなので、もっと便利に使えるようにしました。

RubyGemsはここで、ソースはここで確認できます。

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を定義したくなかったらどうしたらいい?

Gemfilesuper_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なら定義される予定のアトリビュートを確認できる、といういい点もありますし。
(その反面、悪い点としては実際に指定しないといけない、というのがありますが)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0