Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

週刊Railsウォッチ: RailsコントローラのparamsはHashではない、ruby-enumほか(20240125後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

  • 各記事冒頭には🔗でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • お気づきの点がありましたら@hachi8833までメンションをいただければ確認・対応いたします🙏

TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)

🔗Rails

🔗 RailsコントローラのparamsはHashではない


つっつきボイス:「paramsをHashと思い込んでいる人って結構いるんだろうか」「そういう記事をよく見かけると書かれていますね」「自分の観測範囲ではあまり見かけなかったかな〜」

HashWithIndifferentAccessだと思い込むならまだありそうかも: というのも実際昔は本当にHashWithIndifferentAccessを継承する形でparamsを使われていた時期があったんですよ」「あ、そうだったんですね」

「今は継承ではなくてコンポジションの形でHashWithIndifferentAccessがparamsに取り入れられているので、jnchitoさんの記事にもあるようにparams.class.ancestorsで継承関係を表示してもHashWithIndifferentAccessがなくて、ActionController::Parametersの中にハッシュをwith_indifferent_accessしたものが入る」「なるほど」「このあたりはコードを見ればわかると思います」

参考: §4 パラメータAction Controller の概要 - Railsガイド


後で調べると、paramsがHashWithIndifferentAccessを継承しなくなったのはRails 5.0でした↓。

参考: §8.11 ActionController::Parametersは今後HashWithIndifferentAccessを継承しない -- Rails アップグレードガイド - Railsガイド

🔗 undercover: テストを追加しないデプロイを警告する(Ruby Weeklyより)

grodowski/undercover - GitHub


つっつきボイス:「カバレッジ支援ツールだそうです」「READMEにあるように、CIの自動テストの一環として動かすことで、コードに差分が生じたときにテストが追加されていないと怒ってくれるのね: 必要なら使ってみてもよさそう👍」

🔗 2023年のSpamAssassinのルールを深掘りする(Ruby Weeklyより)


つっつきボイス:「SpamAssassin懐かしい、相当昔からあるヤツ」「Apache Projectsのソフトウェアなんですね」「Assassin(暗殺)ってすごい名前」

参考: Apache SpamAssassin: Welcome
参考: Apache Projects List

「他のスパムチェックツールもそうですけど、SpamAssassinはこういう感じでX-Spam-Scoreをメールヘッダーに追加して転送してくれる↓」「なるほど」「スコアが一定の値を超えたときの後処理とかは別のところでやる形になりますね」「spamassassinコマンドにemlファイルを直接渡して実行できるの初めて知った」

# 同記事より
X-Spam-Report: 
    *  0.0 HTML_MESSAGE BODY: Nachricht =?UTF-8?Q?enth=E4lt?= HTML
    *  2.8 HTML_IMAGE_ONLY_28 BODY: HTML: images with 2400-2800 bytes of words
    * -0.0 T_SCC_BODY_TEXT_LINE No description available.
    *  4.0 URI_PHISH Phishing using web form
X-Spam-Score: 6.8
# 同記事より
> spamassassin -Lt < confirmation-instructions.eml
# ...
Content analysis details:   (3.8 points, 5.0 required)

 pts rule name              description
---- ---------------------- --------------------------------------------------
 0.0 HTML_MESSAGE           BODY: HTML included in message
 2.8 HTML_IMAGE_ONLY_28     BODY: HTML: images with 2400-2800 bytes of
                            words
 1.0 URI_PHISH              Phishing using web form

🔗 その他Rails


つっつきボイス:「Friendly.rbはルーマニアのブカレストで初めて開催されたRuby系のイベントで、リンクの動画リストはRailsの話題が多いですね」「RailsのオートローダーZeitwerk作者のXavier Noriaさんも登壇してる」

参考: Rails の自動読み込みと再読み込み - Railsガイド

「2つ目はTurbo 8のスクリーンキャストです」「Drifting Rubyのスクリーンキャストは、動画以外にソースコードも掲載されているのがいいですね」「Codeタブ↓をクリックするとディレクトリ構成も表示されるのは便利👍」


同スクリーンキャストより

🔗Ruby

🔗 ruby-enum: Rubyでenumを使えるようにする(Ruby Weeklyより)

dblock/ruby-enum - GitHub


つっつきボイス:「ウォッチで取り上げていそうでいなかったgemです」「Rubyにシンプルなenumの機能を追加するgemなのね: ちなみにRailsには前からActiveRecord::Enumがありますね」

# 同リポジトリより
class OrderState
  include Ruby::Enum

  define :CREATED, 'created'
  define :PAID, 'paid'
end

OrderState::CREATED # 'created'
OrderState::PAID    # 'paid'
OrderState::UNKNOWN # raises Ruby::Enum::Errors::UninitializedConstantError
OrderState.keys     # [ :CREATED, :PAID ]
OrderState.values   # [ 'created', 'paid' ]
OrderState.to_h     # { :CREATED => 'created', :PAID => 'paid' }

Railsのenumを使いこなす方法(翻訳)

「enumが欲しいときは多いので、Rubyでシンプルなenumだけ使いたいときはruby-enumを使ってみてもいいかも」「Ruby用のenum、dry-rbにありそうな気がしたら本当にあった↓」

参考: dry-rb - dry-types v1.0 - Enum

🔗 statesman: ステートマシンgem(Ruby Weeklyより)

gocardless/statesman - GitHub


つっつきボイス:「いわゆるステートマシンgemなんですが、★が多いのと名前がstatesman(政治家)なのがちょっと面白いと思って取り上げてみました」「ステートマシンが必要になることは割りとよくありますね: Rubyのステートマシンといえばaasmなどが昔から使われています」

# 同リポジトリより
class OrderStateMachine
  include Statesman::Machine

  state :pending, initial: true
  state :checking_out
  state :purchased
  state :shipped
  state :cancelled
  state :failed
  state :refunded

  transition from: :pending,      to: [:checking_out, :cancelled]
  transition from: :checking_out, to: [:purchased, :cancelled]
  transition from: :purchased,    to: [:shipped, :failed]
  transition from: :shipped,      to: :refunded

  guard_transition(to: :checking_out) do |order|
    order.products_in_stock?
  end

  before_transition(from: :checking_out, to: :cancelled) do |order, transition|
    order.reallocate_stock
  end

  before_transition(to: :purchased) do |order, transition|
    PaymentService.new(order).submit
  end

  after_transition(to: :purchased) do |order, transition|
    MailerService.order_confirmation(order).deliver
  end
end

aasm/aasm - GitHub

参考: 有限オートマトン - Wikipedia

🔗 その他Ruby


つっつきボイス:「thoughtbotのメンバーがRubyConf 2023で登壇した動画がYouTubeにアップロードされたという記事です」「3人も登壇してる」「この"時刻の扱いは大変だよ"という発表とか面白そう↓」「時刻の扱いはRailsと直結するデータベースの範囲に収まるなら特に難しくないけど、外部の何かと関連してくるようになると急に難しくなりがち」

「その次のは暗号解読関連の発表みたい」「画面で見えているのはエニグマかなと思ったら本当にそうなんですね」

参考: エニグマ (暗号機) - Wikipedia

🔗 設計・セキュリティ

🔗 『自動テストとテスト駆動開発⁠⁠、その全体像』


つっつきボイス:「テストで有名なt_wadaさんによるSoftware Designの記事が技術評論社のサイトで公開されていたので取り上げてみました」「お、自動テストとテスト駆動開発の基本的な部分をその道の人ががっつり押さえて書いてくれている👍」「Software Designは電子書籍版もありますね」

🔗 スライド『失敗例から学ぶSOLID原則』


つっつきボイス:「設計の失敗例の解説です」「スライドにもあるように、たくさん設計して勘を養って失敗の経験を積んでいくことでしょうね」「設計の失敗は後になってからわかることも多いし、かといって事前に備えておこうと頑張りすぎるとYAGNIになったりしがち」「初期設計でどのぐらいリソースを割けるかにもよるでしょうし」

参考: YAGNI - Wikipedia

🔗 システムテストは大事

「設計の失敗というよりシステムの失敗ですけど、"システムテストが存在しない"のは明らかに痛恨」「システムを調査してシステムテストを書くところから始めないといけなくなるのは残念ですよね」「システムテストを書く習慣がなかった時代は、設計でやらかしたときのリカバリーがつらかったので、事前の設計を慎重にやる方に重点が置かれることが比較的多かったと思いますけど、システムテストが揃っていれば、設計で少々失敗することがあってもリファクタリングは比較的やりやすくなるので何とかなる場合も多いんじゃないかな」

「単体テストは細かく揃っていてもシステムテストがろくにないのは、つらい」「単体テストは設計を変更したらどっちみち捨てて作り直すものですけど、API連携みたいな機能レベルをカバーするシステムテストが揃っていないと設計レベルの変更やリファクタリングで触るのが怖くなる」「せめて正常系だけでもシステムテストはあって欲しいですよね」

🔗クラウド/コンテナ/インフラ/Serverless

🔗 未使用のIAMロール・ユーザー・権限を自動検出する機能


つっつきボイス:「BPS社内Slackに貼っていただいた記事です」「そうそう、使ってないIAMのユーザーやロールや権限を検出できるのはとっても良さそう👍」「有料の機能だけど、使うときだけオンにすればいいかも」

「IAMユーザーは明示的に作らないと追加されないんですけど、たとえばIAMロールなんかは、AWS Management Consoleでサービスの設定を追加しているときに、サービスの種類によってはIAMロールが必須のものがあって、そういったものはウィザードの中で自動的にIAMロールが作られていくんですよ」「なるほど」

参考: CloudWatch Logs リソースへの許可の管理の概要 - Amazon CloudWatch Logs

🔗 AWS側の目線から理解するGoogle Cloudロードバランサの世界


つっつきボイス:「AWSのロードバランサと比較する形でGoogle Cloudロードバランサを解説しているのね」

「AWSのClassic Load Balancerはもう新規では使われなくなってるヤツ」「Gateway Load Balancer (GWLB)は知らなかった」


同記事より

「Googleのロードバランサーはこんなにあるんですね」「内部通信にもロードバランサーをはさむような概念になっているっぽい」「ネットワークロードバランサやプロキシ型/パススルー型の違いなども詳しく解説されてますね」


同記事より

「わかりやすくていい記事👍」

🔗 書籍『実務で使えるメール技術の教科書』


つっつきボイス:「ツイートでタイムリーと言っているのは、高校出願システムのメールがGmailに配信されなかった例の問題↓のことでしょうね」「2024/2/21発売予定で予約受付中とあるのでまだ販売されていないけど」「チェックしておこうかな」

参考: 「高校出願システムからGmailに届かない」問題10日で解消も、「キャリアの迷惑メールフィルターにかかる」問題発覚 - ITmedia NEWS


後編は以上です。

バックナンバー(2024年度第1四半期)

週刊Railsウォッチ: Railsの必須Rubyバージョンが3.1.0以上に変更ほか(20240123前編)

ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。

Ruby Weekly


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。