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
validationについて
Search
ryonext
December 16, 2015
Programming
860
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
validationについて
ryonext
December 16, 2015
More Decks by ryonext
See All by ryonext
AWS Lambda の Ruby 対応
ryonext
0
280
TwitterのList編集しやすいやつ作った
ryonext
0
1.8k
AWS Lambda と API GatewayでRails使わずに済んだ話
ryonext
8
4.4k
capistrano-bundle_rsync使ったらオートスケールが高速化した話
ryonext
8
2.6k
PumaとUnicornで最近自分が理解したこと
ryonext
13
9.6k
Hubot事例
ryonext
1
1.7k
Redisでバッチ処理を冗長化しつつ排他制御
ryonext
0
2.2k
CircleCIとwercker
ryonext
3
1.3k
rubykaigi 3day interactive white board
ryonext
2
410
Other Decks in Programming
See All in Programming
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
810
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
0
230
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
110
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
440
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
1
480
MySQLとPostgreSQLって何が違うの?
akagami
PRO
0
160
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
330
iOS開発×AI駆動開発 〜最近使って便利だったスキルの話〜
nogu66
0
140
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
150
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
260
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
130
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
630
Featured
See All Featured
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
290
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
A Modern Web Designer's Workflow
chriscoyier
698
190k
What's in a price? How to price your products and services
michaelherold
247
13k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
240
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
600
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
320
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
570
Technical Leadership for Architectural Decision Making
baasie
3
550
Transcript
WBMJEBUJPOʹ͍ͭͯ
ࣗݾհ w גࣜձࣾϢχίϯ w 5XJUUFS!SZPOFYU w ήʔϚʔ w ΜΜͱ͔εϓϥτΡʔϯͱ͔ w
;ͩΜ3BJMTͬͯ·͢
࠷ۙͷਐḿͰ͢ w ࠓճΏͬͨΓͬͯΔͷͰ·ͩ)3Ͱ͢ w ΤϯδχΞϞϯϋϯ4MBDL্ཱͪ͛ͯΔͷͰڵຯ͋Δํ͓ ͕͚͍ͩ͘͞
ษڧձʗίϛϡχςΟ w 4IJCVZBSC w :PLPIBNBSC w ,BXBTBLJSC w ͋ͨΓʹࢀՃͯ͠·͢ɻ
ձࣾͰ͍ͬͯΔ͜ͱ ւ֎͚ήʔϜΩϡʔϨγϣϯαʔϏεͷ 3PDL6.FEJBDSBGU IUUQTNFEJBDSBGUSPDLVBQQTDPN ւ֎͚ήʔϜϑΥʔϥϜͷ 3PDL65BML IUUQTUBMLSPDLVBQQTDPN ͷ։ൃΛ͍ͬͯ·͢ɻ
ࠓ͢͜ͱ w γεςϜͷͨΊͷWBMJEBUJPOʹ͍ͭͯ w 3BJMTͰWBMJEBUJPO͢Δ w %#Ͱ੍Λ͔͚Δ w 69ͷͨΊͷWBMJEBUJPOʹ͍ͭͯ w
+4ͰWBMJEBUJPO͢Δ
ίʔυʹ͍ͭͯ w ίʔυීஈࢲ͕ۀͰ͍ͬͯΔ3BJMTͰͷ࣮ ྫʹͳΓ·͕͢ɺ8FCϑϨʔϜϫʔΫશൠʹ ͍ͭͯಉ͜͡ͱ͕ݴ͑ΔΜ͡Όͳ͍͔ͳ͊ͱࢥ ͍·͢
WBMJEBUJPO͠·͠ΐ͏
Ϣʔβ໊ͷཁ݅͜ΕͰ w ͞จࣈ·Ͱ w ඞਢ
3BJMTͩͱ class User < ActiveRecord::Base validates :name, length: { maximum:
20 }, presence: true end
͜͏ͳΔ
؆୯ʂ
ͱ͜Ζ͕
3BJMTͷWBMJEBUJPOΞϓϦϨΠϠʔͰ ݕূՄೳͳϝιουͷ߹ʹͷΈ ݕূ͢Δ͚ͩͳͷͰ
Ϩίʔυʹ*OTFSU w */4&35JOUPVTFSTTFUOBNF B@OBNF@UIBU@JT@PWFS@UIBO@@DIBSBDUFST
WBMJEBUJPO͕Βͳ͍ϝιου Λ͏ VTFSVQEBUF@DPMVNO OBNF MPOH@OBNF@UIBU@PWFS@UIBO@UXFOUZ@DIBSBDUFST VTFSTBWF WBMJEBUFGBMTF
ͷΑ͏ͳૢ࡞Ͱɺ؆୯ʹ WBMJEBUJPOҧͷσʔλ͕࡞ΕΔ
ͦͯ͜͠ΕΛը໘͔Β ૢ࡞͠Α͏ͱ͢Δͱ w ࠓճͷૢ࡞Ͱ໊લΛมߋ͍ͯ͠ͳ͍ʹ͔͔Θ Βͣɺ໊લͰΤϥʔʹͳΔ มߋͨ͠ͷ͜͜
͞Βʹ
ύεϫʔυมߋը໘ w ଞͷઃఆը໘ͱΓग़ͯ͠ɺύεϫʔυ͚ͩ Λมߋ͢Δը໘ͱ͍͏ͭ͘ΓΑ͋͘Δͱࢥ͍ ·͢
ύεϫʔυΛมߋ͢Δը໘ͳͷʹɺ ໊લ͕ͯ͘ΤϥʔͱݴΘΕΔ w ͪΖΜɺ͜ͷը໘Ͱ໊લΛม͑Δ͜ͱͰ͖ͳ͍ w ϢʔβͲ͏͠Α͏ͳ͍
͕ͨͬͯ͠ w 8FCΞϓϦϨΠϠʔͰͷ੍͚ͩͰͳ͘ɺ͖ͬ ͪΓͱ%#Ͱͷ੍ΛೖΕ·͠ΐ͏
class CreateUsers < ActiveRecord::Migration def change create_table :users do |t|
t.string :name, limit: 20, null: false t.string :password t.timestamps null: false end end end %#ʹMJNJUͱOPUOVMM੍Λֻ͚ Δʢ3BJMTͷNJHSBUJPOͰΔྫʣ
Μɺ͡Ό͋%#ͷ੍͚ͩష͓͚ͬͯɺ 3BJMTͷWBMJEBUJPOཁΒͳ͍Μ͡ΌͶʁ
ͱ͍͏Θ͚ͰͬͯΈΔͱ
WBMJEBUJPOΤϥʔ͕ฦ͍ͬͯͨ ՕॴͰΤϥʔʹ
͡Ό͋͜ͷ%#ͷΤϥʔΛྫ֎DBUDIͯ͠ɺ దͳΤϥʔϝοηʔδΛฦ͢Α͏ʹ ͯ͠Εɾɾɾ
ͦΕɺ3BJMTͷWBMJEBUJPOͷ ํָ͕͡ΌͶ
ͱ͍͏Θ͚Ͱ w %#ͷ੍γεςϜΛकΔͨΊʹઈରʹֻ͚· ͠ΐ͏ɻ͕͜͜ΞϓϦϨΠϠʔͰͷWBMJEBUJPOΑ ΓΏΔ͍ͱ͍͏͜ͱ͕͍͚͋ͬͯͳ͍ɻ w ΞϓϦϨΠϠʔͰɺແବͳΫΤϦൃߦΛ͠ͳ ͍ʗΤϥʔॲཧΛదʹ͢ΔͨΊʹWBMJEBUJPOΛ Δ͜ͱΛڧ͘ਪ͠·͢ɻ
ΊͰͨ͠ΊͰͨ͠
Ͱͳ͍ʂ
͜͜·Ͱ w γεςϜͷͨΊͷWBMJEBUJPOͷ
͔͜͜Β w 69ͷͨΊͷWBMJEBUJPOͷ
69ͷͨΊͷWBMJEBUJPOͱʁ w Α͋͘ΔϢʔβొϑΥʔϜ
Ϣʔβ*%ΛೖΕͯΈΔ w ొϘλϯΛԡ͢ͱ͢ͰʹΘΕ͍ͯ·͢ɺͱΤ ϥʔ͕ฦͬͯ͘Δ
ผͷ*%Λࢼ͢ w ·ౖͨΒΕΔ
͞Βʹผͷ*%Λࢼ͢ w ·ͨ·ͨΤϥʔʹͳΔ
Ϣʔβʔౖͬͯ ͯ͠͠·͏
Ͳ͏͢Ε͍͍ͷ͔ʁ w ೖྗ͢ΔϘλϯԡ͢Τϥʔ͕ฦͬͯ͘ Δɺͱ͍͏Ұ࿈ͷྲྀΕΛ܁Γฦ͢ͷۤ௧ w ೖྗͨ࣌͠Ͱɺͦͷೖྗ͕ड͚ೖΕՄೳ͔Ͳ ͏͔ΛΘ͔ΔΑ͏ʹ͢Δ͖
Ϣʔβ͕ೖྗΛऴ͑ͨλΠϛϯάͰϑΟʔυόοΫ μϝͳ߹ͦͦԡͤͳ͘͢Δ
ޭ͢Δ߹ڭ͑ͯ͋͛Δ
w %#Ͱ͙ͷγεςϜͷͨΊͷWBMJEBUJPO w Ϣʔβʹշదʹೖྗͯ͠Β͏ͨΊͷɺ69ͷͨ ΊͷWBMJEBUJPO͕ඞཁ
Ͳ͏࣮ݱ͢Δ͔ʁ w ઌఔͷྫɺ%#ͰͷॏෳνΣοΫ͕ඞཁͳͷ Ͱ+BWBTDSJQU "1*ͷ࿈ܞ͕ඞཁͳέʔεɻ ͪΐͬͱ͍͜͠ͷͰ͋ͱͰɻ w ·ͣɺ'PSN͚ͩͰஅͰ͖Δɺʮඞਢೖྗʯ ʮ੍͞ݶʯʮϑΥʔϚοτνΣοΫʯʹ͍ͭ ͯ͠·͢ɻ
'PSNͰஅ͢ΔWBMJEBUJPO w ྫ͑ɺ)5.-ʹSFRVJSFEଐੑFNBJMଐੑ ͳͲ͕͋Δ w ೖྗඞਢ߲ʹೖྗ͍ͯ͠ͳ͔ͬͨΓɺࢦఆͷ ϑΥʔϚοτʹͳ͍ͬͯͳ͔ͬͨΒϒϥβϨ ϕϧͰΤϥʔΛฦͯ͘͠ΕΔ w ·͋ศར
<input placeholder="Username" required type="text" name="account[username]" id="account_username" />
ͱ͜Ζ͕ w ಈ͔ͳ͍ϒϥβ͕
w ͋Δ͚Ͳɺͦ͏͍͏ϨϕϧͷͰͳ͘ w *&ࢮΜͩʂ͏͍ͳ͍ʂ ͋
4BGBSJ w ಈ͔ͳ͍ w ࠷৽ͷ.BD04 J04Ͱಈ͔ͳ͍ w ͜ΕͰಈ͔ͳ͍Ҏ্ɺීٴΛߟ͑ΔͱཔΕͳ ͍ͱߟ͑Δ͖
+BWBTDSJQUͰΔ w K2VFSZͳΒ͍͔ͭ͘ϓϥάΠϯ͕͋Δ w 7VF 3FBDU "OHVMBSͷϑϨʔϜϫʔΫΛ༻ ͍ͯ͠ΔͳΒɺͦ͜Ͱͷྲّྀʹै͏ͱָ࣮͕ ͳͣ
௨৴͕ඞཁͳͭɺ ೖྗͷλΠϛϯάͰ௨৴ͯ݁͠ՌΛग़ͯ͠Δ
͜͏͍͏Πϝʔδ 'PSN Ϣʔβ +BWBTDSJQU "1* %# ೖྗ มߋΛݕ ೖྗ༰ΛૹΔ %#ʹ͍߹Θͤ
0,/( 0,/( 0,ʗ/(
+4͔ΒݺͿ ʢલεϥΠυ ͷεςοϓ 4 $ -> 5 $("#username").keyup(-> 6
$.get( 7 "/accounts/exists", 8 { username: $('#username').val() }, 9 (data) -> 10 if data.result 11 $("#account-result").html("<div class='glyphicon glyphicon-remove text-danger'>͜ͷϢʔβ໊ΘΕ͍ͯ·͢</div>") 12 $("#submit-button").prop("disabled", true) 13 else 14 $("#account-result").html("<div class='glyphicon glyphicon-ok text-success'>͜ͷϢʔβ໊༻ՄೳͰ͢</div>") 15 $("#submit-button").prop("disabled", false) 16 ) 17 ) 18 w $P⒎FF4DSJQUͰ͢ w ࣮ࡍʹLFZVQͰΔͱ௨৴සଟ͗͢ΔͷͰEFCPVDF͢ΔQMVHJOͳͲ͍·͠ΐ͏ w ྫK2VFSZͰ͕͢ɺԿΒ͔ͷϑϨʔϜϫʔΫΛ͏ͷΦεεϝͰ͢
֬ೝ༻"1*࡞Δ ʢdͷεςοϓ Rails.application.routes.draw do resources :accounts do collection do get
"exists", to: "accounts#exist" end end end class AccountsController < ApplicationController def exist if Account.exists?(username: params[:username]) render json: { result: true }.to_json else render json: { result: false }.to_json end end end
͜͜Ͱ w +4ͷWBMJEBUJPO͚͓͚ͩͬͯɺ%#ͷ੍ཁ Βͳ͍Μ͡Όͳ͍ʁ
Μͳͨ͜ʔͳ͍ w +4ඇରԠϒϥβʗΦϑʹ͢Δʗ1045 ͷ63-Λୟ͘ɺճආ༨༟
w +4ͱ%#͚͓͚ͩͬͯ3BJMTͷ͍ͭΒͳ ͍Μ͡Όͳ͍ʁ
͋·ΓΑ͘ͳ͍ w +4ճආ͢ΔΑ͏ͳΞΫηεʹରͯ͠ɺ3BJMTͰద ͳWBMJEBUJPOͰΤϥʔϝοηʔδΛฦͯ͠Δ ඞཁͳ͍·͋Θ͔Δ w %#ʹରͯ͠ແବͳ௨৴ʗΫΤϦ͕ൃߦ͞ΕΔՄ ೳੑ͕͋ΔΑ͘ͳ͍
͞Βʹ w "1*Խ͢ΔͷͰ͋Εɺ3BJMTͷNPEFMʹΑΔ WBMJEBUJPO͕͙ՕॴͱͳΔ w େͨ͠खؒͰͳ͍ͷͰɺNPEFMͰͷWBMJEBUJPO ͓ͬͯ͘΄͏͕ྑ͍ɻ
8FCΞϓϦͰͳ͘εϚϗͷ ߹ʁ w "1*αʔόཱͯͯɺεϚϗ͔Β"1*Λୟͭ͘
69ͷͨΊͷWBMJEBUJPO ΫϥΠΞϯτଆͰ w +4ͷ࣌ͱಉ͡Α͏ʹɺۃྗແବͳ௨৴Λൃੜ͞ ͤͣʹɺϢʔβͷೖྗʹରͯ͠ૉૣ͘ϑΟʔυόο ΫΛฦ͢
αʔόଆ w %#ଆݴ͏·Ͱͳ͘ඞཁ w ΫϥΠΞϯτ͕όά͍ͬͯΔՄೳੑ͋ΔͷͰɺ 8FCΞϓϦͷNPEFMͰͷWBMJEBUJPOඞཁɻ
·ͱΊ w ࠷ޙඌ %# Ͱෆਖ਼ͳઈରޚ͢Δγες ϜͷͨΊͷWBMJEBUJPO w ࠷લྻ +4 ΫϥΠΞϯτΞϓϦ
Ͱਖ਼ৗೖྗͷͨ ΊͷಋઢΛ࡞ͬͯ͋͛Δ69ͷͨΊͷ WBMJEBUJPO
͝੩ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠