Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
rails newと同時に型を書く
Search
a_fujisaki
January 09, 2025
Programming
3
340
rails newと同時に型を書く
a_fujisaki
January 09, 2025
Tweet
Share
More Decks by a_fujisaki
See All by a_fujisaki
“Rails × 型”での2年間を振り返る
aki19035vc
2
1k
rbs-inlineを使ってみた
aki19035vc
0
540
Emacs × LSP × Steep
aki19035vc
0
120
MiniMagickの型を生成したい
aki19035vc
0
74
最近追加した型の紹介とその振り返り
aki19035vc
0
450
Other Decks in Programming
See All in Programming
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
220
情報漏洩させないための設計
kubotak
5
1.2k
StarlingMonkeyを触ってみた話 - 2024冬
syumai
3
320
AppRouterを用いた大規模サービス開発におけるディレクトリ構成の変遷と問題点
eiganken
1
380
KubeCon NA 2024の全DB関連セッションを紹介
nnaka2992
0
110
htmxって知っていますか?次世代のHTML
hiro_ghap1
0
390
DevFest - Serverless 101 with Google Cloud Functions
tunmise
0
130
Go の GC の不得意な部分を克服したい
taiyow
3
950
テストコードのガイドライン 〜作成から運用まで〜
riku929hr
6
1.3k
技術的負債と向き合うカイゼン活動を1年続けて分かった "持続可能" なプロダクト開発
yuichiro_serita
0
230
CloudflareStack でRAGに入門
asahiiwm
0
140
Fibonacci Function Gallery - Part 1
philipschwarz
PRO
0
260
Featured
See All Featured
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
97
17k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Rails Girls Zürich Keynote
gr2m
94
13k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
Site-Speed That Sticks
csswizardry
2
210
Bash Introduction
62gerente
609
210k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
111
50k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
3
220
A Philosophy of Restraint
colly
203
16k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
171
50k
KATA
mclloyd
29
14k
Transcript
rails newと同時に型を書く Roppongi.rb#26 <2025-01-09> @aki19035vc
自己紹介 ❏ 藤崎 亮人 (a_fujisaki) ❏ @aki19035vc ❏ イタンジ株式会社 ❏
不動産会社向けのSaaSを提供 ❏ バックエンドエンジニア ❏ ほぼRails・たまにScala ❏ Next.js(Typescript)始めました ❏ 物件基盤の開発責任者 ❏ Rails × 型 の話が好き ❏ 学生の頃(2016年くらい)からEmacs使ってます
イントロ ❏ Railsで型を書くコツは最初から型を書いておくこと ❏ rails new と同時に型を導入する方法を紹介します ❏ サンプルのrailsアプリケーション ❏
https://github.com/aki19035vc/rails_with_rbs_202501 ❏ 各種バージョン(2025年1月時点で利用できる最新のもの) ❏ rails: 8.0.1 ❏ rbs: 3.8.1 ❏ rbs-inline: 0.10.0 ❏ rbs_rails: 0.12.1 ❏ steep: 1.9.3
rails new ❏ シンプルなAPIサーバー ❏ minimalオプションつけてもCIとかkamalとかsolid-xxxとかの設定ファイルが作 られる ❏ 不要なのでスキップ
scaffoldで最低限の体裁を整える ❏ scaffoldで最低限の体裁を整える ❏ migration, model, controller, routes, test とか全部作られる
型チェック用の gemを追加する ❏ Gemfileに3つのgemを追記してbundle install ❏ rbs-inline ❏ rbs(rubyの型定義)をソースコード内にコメントでかけるようにする gem
❏ rbs_rails ❏ ActiveRecordで動的に定義される型を生成する gem ❏ steep ❏ 実際に型チェックするgem
gemの型をローカルにダウンロード ❏ init ❏ rbs_collection.yamlをプロジェクトルートに生成する ❏ 型情報のダウンロード先とか諸々の設定ファイル ❏ install ❏
使用しているgemをGemfileから読み取り、プロジェクトルートの .gem_rbs_colleciton ディレクトリにダウンロードする
steepの設定 ❏ プロジェクトルートにSteepfileが生成される ❏ たくさんコメントが書かれている(左)が、シンプル (右)な設定に書き換える
rbs_railsのrakeタスクを作成 ❏ ActiveRecordで動的に定義される型を生成するrakeタスクを定義 ❏ デフォルトは rbs_rails:all というタスク名 ❏ https://github.com/aki19035vc/rails_with_rbs_202501/blob/8ab28bb320d69daacc4cc3532257f5f09a 633608/lib/tasks/rbs.rake
❏ 型情報はsig/rbs_rails ディレクトリ以下に出力される ❏ https://github.com/aki19035vc/rails_with_rbs_202501/tree/main/sig/rbs_rails
rbs-inlineで型定義を生成 ❏ app ディレクトリ以下のrubyファイルを読み込み、型定義を生成する ❏ 通常は # rbs_inline: enabled (マジックコメント)が付与されたファイルが対象
❏ 出力先は sig/rbs_inline/app ディレクトリ ❏ https://github.com/aki19035vc/rails_with_rbs_202501/tree/main/sig/rbs_inline/app ❏ --opt-out オプションでマジックコメントを付与しなくてもよくなる
型チェック!! ❏ 型の導入は完了 ❏ コントローラーの型を書いてないので書く必要あり ❏ モデルには何もメソッドを実装していないので書く必要なし
コントローラーに型を書く ❏ メソッドの上にコメントで型定義を記述 ❏ インスタンス変数 @posts @post にも型を 書く https://github.com/aki19035vc/rails_with_rbs_202501/blob/main
/app/controllers/posts_controller.rb
型チェック用の rakeタスクを用意 rails typecheck というコマンド一つで型 チェックを実行できるようにする ❏ rbs-inline・rbs_rails での生成 ❏
steep check を実行 https://github.com/aki19035vc/rails_with_rbs_202501/ blob/main/lib/tasks/rbs.rake
型チェック & カバレッジ
まとめ ❏ Railsで型を書くコツは最初から型を書いておくこと ❏ ミニマムな状態からなら型の導入はすぐできる ❏ rbs-inline, rbs_rails, steep という3つのgemを入れて少し設定するだけ