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 SPA で作って RubyKaigi で配布した話
Search
kokuyouwind
December 19, 2025
Programming
90
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
謎解きサイトを Rails SPA で作って RubyKaigi で配布した話
「忘年LT大会~今年のドヤ!を発表しあおう~」の発表資料です。
https://leanertechnologies.connpass.com/event/376577/
kokuyouwind
December 19, 2025
More Decks by kokuyouwind
See All by kokuyouwind
疑似コードによるプロンプト記述、どのくらい正確に実行される?
kokuyouwind
0
560
ドメイン指定Cookieとサービス間共有Redisで作る認証基盤サービス
kokuyouwind
0
42
Do LLMs dream of Type Inference?
kokuyouwind
0
45
Let's use LLMs from Ruby 〜 Refine RBS types using LLM 〜
kokuyouwind
0
8.5k
APMをちゃんと使おうとしたら、いつのまにか独自gemを作っていた話
kokuyouwind
0
970
RBS meets LLMs - Type inference using LLM
kokuyouwind
0
1k
オンラインボードゲームを作りたい人生だった
kokuyouwind
0
700
1年間本番運用してわかった、スタートアップこそAWS Copilot CLIを使うべきNつの理由
kokuyouwind
2
12k
なるべく楽したいAWSセキュリティ
kokuyouwind
1
120
Other Decks in Programming
See All in Programming
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
290
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
510
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
220
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
340
React本体のコードリーディング
high_g_engineer
1
150
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
700
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
330
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
150
源内ハンズオン概要編
hideg
0
190
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
560
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
590
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
1
140
Featured
See All Featured
How to Talk to Developers About Accessibility
jct
2
520
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
250
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Docker and Python
trallard
47
4.1k
Git: the NoSQL Database
bkeepers
PRO
432
67k
The untapped power of vector embeddings
frankvandijk
2
1.8k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
ラッコキーワード サービス紹介資料
rakko
1
4.4M
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.4k
Transcript
謎解きサイトを Rails SPA で作って RubyKaigi で配布した話 Leaner Technologies, Inc. 黒曜
(@kokuyouwind) 1
$ whoami 黒曜 / @kokuyouwind Leaner Technologies Inc. 所属 Rails
エンジニア・SRE 今はLeaner の認証基盤サービスを 作ってます 2
2025 年のドヤ! 3
Kaigi on Rails で認証基盤の話をした! https://kaigionrails.org/2025/schedule/#day2 4
https://gihyo.jp/magazine/SD/archive/2025/202511 Software Design に記事を寄稿した! 5
RubyKaigi でゲームナイトを開催! https://leanertechnologies.connpass.com/event/349031/ 6
個⼈的イチオシのドヤ! 7
RubyKaigi で⾃作謎解きを配布! 8
Cursor YOLO 使って1 時間くらいで Rails SPA に移植 当初LINE アプリで作ったが、 海外の⼈はLINE
使ってないと気づいた 9
https://escape-game-rubykaigi-2025.kokuyouwind.com/ デモ 10
実装 - 回答判定(Turbo Stream) class KeyController < ApplicationController CORRECT_ANSWERS =
[ " ほげ", # 0: 問題1, " ふが", # 1: 問題2 ] def update # 正解判定 key_id = params[:id].to_i is_correct = (params[:value] == CORRECT_ANSWERS[key_id]) if is_correct # 正解の場合のみsession に値を保存 session["key_#{key_id}_value"] = params[:value] else # 不正解の場合はflash.now に不正解フラグを設定 flash.now["key_#{key_id}_incorrect"] = true # 不正解でも⼊⼒値をリクエスト内で保持 @input_value = params[:value] end 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 render turbo_stream: [ turbo_stream.replace( "key_answer_form_#{key_id}", partial: "top/key_answer_form", locals: { index: key_id } ), turbo_stream.replace( "key_answers_table", partial: "top/key_answers_table" ) ] end end 1 2 3 4 5 6 7 8 9 10 11 12 13 11
実装 - カタカナ変換(Stimulus) // クロスワードの答え⼊⼒をカタカナに変換するコントローラー // app/javascript/controllers/key_input_controller.js export default class
extends Controller { static targets = ["incorrectIcon", "input", "form"] connect() { // コントローラーが接続された時の処理 // フォーム送信前にカタカナ変換を⾏う if (this.hasFormTarget) { this.formTarget.addEventListener( 'submit', this.handleSubmit.bind(this)) } } ... // 利⽤側ではdata: { key_input_target: "form" } を指定 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 12
ドヤポイント 謎解きの主題にイベントに因んだ題材を盛り込んだ Ruby ⾔語, RubyKaigi, 松⼭にまつわるもの リーナーの会社や主催イベントにまつわるもの AI を活かして⼿早くサイト化できた 知ってるけど使ったことのない技術を実例で試せた
Turbo Stream Stimulus 13
来年もなんかやるぞ!!! https://rubykaigi.org/2026/ 14
BuriKaigi も登壇するのでよろしくです https://fortee.jp/burikaigi-2026/proposal/59dc9edc-5d05-4ef4-a82c-39f37df4df5b 15