- Ruby / Rails関連
週刊Railsウォッチ: RailsコントローラのparamsはHashではない、ruby-enumほか(20240125後編)
こんにちは、hachi8833です。
🔗Rails
🔗 RailsコントローラのparamsはHashではない
記事の最後に追記をしました。
「そういうオチか〜い!」とみんなツッコんでやってください😅【トリビア】Railsのコントローラに出てくるparamsはハッシュじゃない https://t.co/u8ZuIthFtW
— Junichi Ito (伊藤淳一) (@jnchito) January 17, 2024
つっつきボイス:「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より)
つっつきボイス:「カバレッジ支援ツールだそうです」「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より)
つっつきボイス:「ウォッチで取り上げていそうでいなかった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' }
「enumが欲しいときは多いので、Rubyでシンプルなenumだけ使いたいときはruby-enumを使ってみてもいいかも」「Ruby用のenum、dry-rbにありそうな気がしたら本当にあった↓」
参考: dry-rb - dry-types v1.0 - Enum
🔗 statesman: ステートマシンgem(Ruby Weeklyより)
つっつきボイス:「いわゆるステートマシン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
🔗 その他Ruby
- 元記事: Update from RubyConf 2023(Ruby Weeklyより)
つっつきボイス:「thoughtbotのメンバーがRubyConf 2023で登壇した動画がYouTubeにアップロードされたという記事です」「3人も登壇してる」「この"時刻の扱いは大変だよ"という発表とか面白そう↓」「時刻の扱いはRailsと直結するデータベースの範囲に収まるなら特に難しくないけど、外部の何かと関連してくるようになると急に難しくなりがち」
「その次のは暗号解読関連の発表みたい」「画面で見えているのはエニグマかなと思ったら本当にそうなんですね」
🔗 設計・セキュリティ
🔗 『自動テストとテスト駆動開発、その全体像』
技術評論社様のご厚意により、Software Design誌に執筆した「自動テストとテスト駆動開発、その全体像」が #gihyojp にて公開されました。混同しやすい概念を自動テスト、テストファースト、テスト駆動開発の3段階に分け、それぞれの効果や注意点を包括的にまとめています。 https://t.co/o3nuTrxBuA
— Takuto Wada (@t_wada) January 16, 2024
つっつきボイス:「テストで有名なt_wadaさんによるSoftware Designの記事が技術評論社のサイトで公開されていたので取り上げてみました」「お、自動テストとテスト駆動開発の基本的な部分をその道の人ががっつり押さえて書いてくれている👍」「Software Designは電子書籍版もありますね」
🔗 スライド『失敗例から学ぶSOLID原則』
失敗例から学ぶSOLID原則 https://t.co/qBcbVv6uDf
こちらスライドになります!!!#phpcondo
— あすみ (@asumikam) January 13, 2024
つっつきボイス:「設計の失敗例の解説です」「スライドにもあるように、たくさん設計して勘を養って失敗の経験を積んでいくことでしょうね」「設計の失敗は後になってからわかることも多いし、かといって事前に備えておこうと頑張りすぎるとYAGNIになったりしがち」「初期設計でどのぐらいリソースを割けるかにもよるでしょうし」
🔗 システムテストは大事
「設計の失敗というよりシステムの失敗ですけど、"システムテストが存在しない"のは明らかに痛恨」「システムを調査してシステムテストを書くところから始めないといけなくなるのは残念ですよね」「システムテストを書く習慣がなかった時代は、設計でやらかしたときのリカバリーがつらかったので、事前の設計を慎重にやる方に重点が置かれることが比較的多かったと思いますけど、システムテストが揃っていれば、設計で少々失敗することがあってもリファクタリングは比較的やりやすくなるので何とかなる場合も多いんじゃないかな」
「単体テストは細かく揃っていてもシステムテストがろくにないのは、つらい」「単体テストは設計を変更したらどっちみち捨てて作り直すものですけど、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側の目線から理解する、Google Cloud ロードバランサの世界 - How elegant the tech world is...!” https://t.co/dLLyy3AGVb
— sue445 (@sue445) January 15, 2024
つっつきボイス:「AWSのロードバランサと比較する形でGoogle Cloudロードバランサを解説しているのね」
「AWSのClassic Load Balancerはもう新規では使われなくなってるヤツ」「Gateway Load Balancer (GWLB)は知らなかった」
「Googleのロードバランサーはこんなにあるんですね」「内部通信にもロードバランサーをはさむような概念になっているっぽい」「ネットワークロードバランサやプロキシ型/パススルー型の違いなども詳しく解説されてますね」
「わかりやすくていい記事👍」
🔗 書籍『実務で使えるメール技術の教科書』
タイムリーがすぎる
実務で使える メール技術の教科書 基本のしくみからプロトコル・サーバー構築・送信ドメイン認証・添付ファイル・暗号化・セキュリティ対策まで | 増井 敏克 |本 | 通販 | Amazon https://t.co/PqNBAuqqO8
— akuwano (@kuwa_tw) January 17, 2024
つっつきボイス:「ツイートでタイムリーと言っているのは、高校出願システムのメールがGmailに配信されなかった例の問題↓のことでしょうね」「2024/2/21発売予定で予約受付中とあるのでまだ販売されていないけど」「チェックしておこうかな」
参考: 「高校出願システムからGmailに届かない」問題10日で解消も、「キャリアの迷惑メールフィルターにかかる」問題発覚 - ITmedia NEWS
後編は以上です。
バックナンバー(2024年度第1四半期)
- 20240119後編 Ruby 3.3でYJITを有効にすべき理由、Turbo 8の注意点8つほか
- 20240117前編 Rails 8マイルストーン、2023年のRails振り返り、Solid Queueほか
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)