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
95
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
580
ドメイン指定Cookieとサービス間共有Redisで作る認証基盤サービス
kokuyouwind
0
46
Do LLMs dream of Type Inference?
kokuyouwind
0
47
Let's use LLMs from Ruby 〜 Refine RBS types using LLM 〜
kokuyouwind
0
8.6k
APMをちゃんと使おうとしたら、いつのまにか独自gemを作っていた話
kokuyouwind
0
980
RBS meets LLMs - Type inference using LLM
kokuyouwind
0
1k
オンラインボードゲームを作りたい人生だった
kokuyouwind
0
710
1年間本番運用してわかった、スタートアップこそAWS Copilot CLIを使うべきNつの理由
kokuyouwind
2
12k
なるべく楽したいAWSセキュリティ
kokuyouwind
1
120
Other Decks in Programming
See All in Programming
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
250
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
190
Foundry Localでエージェント開発
seosoft
0
110
高専キャリア LT 発表内容
crysta1221
6
5.4k
Cloudflare is Agents
chimame
0
190
バグを直したら useEffect が消えた
colorful12
3
810
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
130
XHTMLが残したもの
yosuke_furukawa
PRO
1
370
AIエージェント時代のコードレビューを設計する
nogu66
5
2.3k
ALB ログから Trace を気合で繋げる技術
fohte
7
850
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.9k
AWS Transform Customによる Spring Boot 2.xから4.xへのVerUp
satoshi256kbyte
2
120
Featured
See All Featured
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
490
The browser strikes back
jonoalderson
0
1.6k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
480
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
840
Prompt Engineering for Job Search
mfonobong
0
430
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
490
The Cult of Friendly URLs
andyhume
79
7k
How to Think Like a Performance Engineer
csswizardry
28
2.8k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
510
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
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