21 March 2010

Grails-Validation


Validation คือ การตรวจสอบ
แล้วจะตรวจสอบไปทำไม ?
แน่นอนครับ web-app ที่เราสร้างขึ้นมา ต้องมีการป้องกัน user กรอกข้อมูลผิด หรือไม่ถูกต้องตามรูปแบบที่เรากำหนด หรือ กรอกข้อมูลยาวเกินไป ถ้าไม่มีการตรวจสอบ ข้อมูลก็จะถูกเก็บลงฐานข้อมูลแบบผิดๆ หรือเก็บไม่ได้เนื่องจาก ข้อมูลที่กรอกมีขนาดใหญ่เกินกว่าจะเก็บได้ ก็ทำให้ข้อมูลผิดพลาดอีก..
เมื่อผู้ใช้กรอกค่าเสร็จและกดตงลง ข้อมูลที่กรอกจะจะส่งไปที่ server แล้ว server จะทำการตรวจสอบ error หากพบ จะส่ง error message กลับมาบอกว่า ส่วนไหน error อย่างไร
เราก็ต้องกำหนดข้อจำกัดลงไปในไฟล์ application(.groovy) ของเราที่อยู่ใน folder domain ...

รู้จักกับข้อจำกัด ซึ่งมีดังนี้...
  1. blank,nullable
    การใช้ : blank:true,nullable:true
    อธิบาย : ใช้เพื่อตรวจสอบว่ามีการเว้นว่างช่องกรอกข้อมูลไว้หรือไม่ ถ้ามีจะแจ้ง error

  2. creditCard
    การใช้ : creditCard:true
    อธิบาย : ใช้เพื่อตรวจสอบรูปแบบของเลข creditCard

  3. display
    การใช้ : display:false
    อธิบาย : hide the field in create.gsp and edit.gsp.

  4. email
    การใช้ : email:true
    อธิบาย : ตรวจสอบรูปแบบของ email

  5. password
    การใช้ : password:true
    อธิบาย : เมื่อกรอกข้อมูล เวลาที่แสดงจะถูกแปลงเป็น ***** เพื่อป้องกันบุคคลอื่นเห็น

  6. inList
    การใช้ : inList:["A","B","C"]
    อธิบาย : สร้าง combo box มีข้อมูลใน list คือ A,B,C

  7. matches
    การใช้ : matches:"[a-zA-Z]+"
    อธิบาย : ตัวอักษรที่ให้ใช้ ถ้าไม่ตรงก็จะแจ้ง error ตัวอย่างนี้ ให้ใช้อักษรอังกฤษ a-z,A-Z เท่านั้น ถ้าเป็นอย่างอื่นจะแจ้ง error

  8. min,max
    การใช้ : min:0,max:100----min:0.0,max:100.0
    อธิบาย : ใช้กำหนดค่าต่ำสุด สูงสุด min,maxนี้ ใช้กับตัวเลข

  9. minSize,maxSize,size
    การใช้ : minSize:0,maxSize:30,size:0..30
    อธิบาย : ใช้กำหนดจำนวนของ ตัวอักษร

  10. notEqual
    การใช้ : notEqual:"FOO"
    อธิบาย : ใช้กำหนดไม่ให้ซ้ำกับคำที่เราต้องการ

  11. range
    การใช้ : range:0..100
    อธิบาย : สร้าง combo box ให้เลือก ตั้งแต่ 0 ถึง 100

  12. scale
    การใช้ : scale:2
    อธิบาย : กำหนดจุดทศนิยมของตัวเลข

  13. unique
    การใช้ : unique:true
    อธิบาย : ตรวจสอบว่าซ้ำกันใน Database ไหม เช่น ใช้ตรวจสอบ user ID ที่ใช้สมัคร

  14. url
    การใช้ : url:true
    อธิบาย : ทำให้แน่ในว่าค่าที่กรอกเป็น รูปแบบของ url

  15. validator
    การใช้ : validator:{return(it%2)==0}
    อธิบาย : ใ้ช้กำหนด validation ตามแบบของคุณเอง

วิธีการใช้ข้อจำกัด
ตอนนี้เราก็รู้จักแล้วว่าสามารถตรวจสอบ หรือ ใส่ข้อกำหนดแบบไหนได้บ้าง มาดู code ตัวอย่างกัน..
-------------------------------------------------
class Race {
//ส่วนที่เราจะเชคก็ให้เอามาใส่ไว้ใน constraints แบบนี้...
static constraints = {
name(blank:false,maxSize:20)
startDate(validator: {return(it > new Date())})
city()
stage(inList:["GA", "NC", "SC"])
distance(min:0.0)
cost(min:0.0,max:100.0)
maxRunners(min:0,max:100000)
}

String name
Date startDate
String city
String stage
BigDecimal distance
BigDecimal cost
Integer maxRunners = 100000

BigDecimal inMiles(){ return distance*0.6214 }
static hasMany = [registrations:Registration,locations:Location,sponsors:Company]

}
-------------------------------------------------

เราก็จะได้แล้วสิ่งที่เราได้ทำลงไป...
ทีนี้ลอง กรอกข้อมูลเล่นๆ ดูกันแบบนี้ แล้วกด create
จะเห็นว่า error message เป็น default..

Changing Error Messages การเปลี่ยนข้อความ error
จะอยู่ใน /...grails-app/i18n/messages.properties ใส่เพิ่มไปตามนี้เลย...
หรือ จะใส่ข้อความ error เป็นภาษาใดก็ได้นะครับ ใส่หลังเครื่องหมาย =

race.name.blank=plsese provide a Name for this Race
race.name.maxSize.exceeded=Sorry, but a Race Name can't be more than {3} letter
race.distance.min.notmet=A Distance of {2}? What are u trying to do, run backwards?
race.maxRunners.min.notmet=Max Runer must be more than {3}
race.maxRunners.max.exceeded=Max Runer must be less than {3}
race.cost.min.notmet=Cost must be more than {3}
race.cost.max.exceeded=Cost must be less than {3}
race.startDate.validator.invalid=sorry, but the past is the past.
-------------------------------------------------
{0} คือ ชื่อ property เช่น name
{1} คือ ชื่อ class เช่น Race
{2} คือ ค่าจากช่องกรอก
{3} to {4} คือ ช่วง เช่น 0 to 10

เราอยากจะให้แสดงตรงไหนก็ใส่ไป

เสร็จแล้ว save ลองแบบเดิมอีกครั้ง...
จะเห็นว่าข้อความได้เปลี่ยนไปตามที่เรากำหนดแล้ว...
A Haa! มันช่างง่ายดายจริงๆ ใช่ไหมหละครับ ถ้าต้องตรวจสอบแบบนี้ ถ้าไม้ใช่ Grails นี่ยากอยู่น้า...

No comments:

Post a Comment