Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
validationについて
Search
ryonext
December 16, 2015
Programming
870
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
validationについて
ryonext
December 16, 2015
Transcript
63 slides
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
͝੩ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠
More Decks by ryonext
See All by ryonext
AWS Lambda の Ruby 対応
ryonext
0
290
TwitterのList編集しやすいやつ作った
ryonext
0
1.9k
AWS Lambda と API GatewayでRails使わずに済んだ話
ryonext
8
4.5k
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
느린 네트워크와 저사양 디바이스 사용자를 위한 웹뷰 로딩 시간 개선기
kmkim
1
240
小さなアプリを作って公開するまで
onozaty
0
170
仕様駆動開発入門 (何を作るかを先に決めて渡す) | 目指せ Kiro マスター 05
inariku
PRO
2
150
LLM 101
dalinaum
0
490
Engineering Biometric UX Across Android Versions | DroidKnights 2026
ryunen344
1
200
Spec-driven Development with AI
simas
PRO
0
2.3k
Enforcing Your Architecture with Unit Tests in the AI Era (Swift Connection X)
steliosf
PRO
1
170
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
420
flutter_test のその先へ — Flutter アプリの LLM 機能に「評価」という品質保証を
kosukesaigusa
0
200
AIが実装を担う時代の「技術設計」と「チームマネジメント」
kamina_zzz
2
260
はじめてのPLATEAU
nokonoko1203
1
650
ローカルLLMの基本と近況 2611 / Local LLM basics and recent situation 2611
kishida
2
320
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Design in an AI World
tapps
1
390
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Paper Plane
katiecoart
PRO
6
55k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
How to build a perfect <img>
jonoalderson
1
6.2k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
We Have a Design System, Now What?
morganepeng
55
8.4k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.3k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1.1k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.7k