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
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
650
Flow は今どうなっているか
mizdra
PRO
0
880
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
130
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
0
300
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
620
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
260
Swift愛好会100回記念 第1回を振り返る
jollyjoester
0
110
Oxlintはいいぞ(続)
yug1224
1
540
高専キャリア LT 発表内容
crysta1221
6
5.5k
自分的「カンファレンスの楽しみ方」
syumai
0
180
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
140
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
200
Featured
See All Featured
A Soul's Torment
seathinner
7
3.5k
Accessibility Awareness
sabderemane
1
200
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
800
Prompt Engineering for Job Search
mfonobong
0
430
Building Flexible Design Systems
yeseniaperezcruz
330
41k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
310
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
760
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
490
Bash Introduction
62gerente
615
220k
Typedesign – Prime Four
hannesfritz
42
3.2k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
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