Ruby on Rails :: Hello, Rails!
Posted by PunNeng, Sun Jun 11 15:54:00 UTC 2006
หลังจากที่เขียนไปแล้วในตอนนู้นนน ว่าด้วยเรื่องโครงสร้างสถาปัตยกรรมของ Rails นี่แหละ เราได้ว่ากันด้วยเรื่อง MVC มันจะทำการรับ request จาก browser แล้วมันจะแกะ request ออกมา ให้ยิงไปที่ action ใน controller ที่มันถูก request มา จากนั้นมันก็จะไปเรียกฝั่ง views ให้มาแสดงผล มันวุ่นวายเสียจริง แต่ว่า ตรงส่วนนี้ Rails จัดการให้หมดครับ ไม่ต้องไปจัดการเอง(นี่แหละ เป็นส่วนหนึ่งของข้อตกลง หรือแบบแผนหรือว่า convention ที่เคยกล่าวมาตอนนู้นนน) ต่อไปผมจะทำการแสดง Hello World ให้ดูละกัน ตรงส่วนนี้ เราไม่ต้องใส่ code ในส่วนของ Models เพราะว่าเราไม่ได้ใช้ตัว DB
ก่อนหน้านี้ เราใช้คำสั่ง "rails" ในการสร้าง project ของเราขึ้นมา ตอนนี้ เราจะใช้คำสั่งอันใหม่ คือ "generate" มันจะทำหน้าที่สร้าง controllers, models และอื่นๆ โดยเราจะสร้าง controller ที่ชื่อว่า say ขึ้นมา โดยพิมพ์ว่า "ruby script/generate controller say"1 ดังนี้
D:\RailsProject\demo>ruby script/generate controller say
exists app/controllers/
exists app/helpers/
create app/views/say
exists test/functional/
create app/controllers/say_controller.rb
create test/functional/say_controller_test.rb
create app/helpers/say_helper.rb
D:\RailsProject\demo>
หลังจากสั่งคำสั่งนี้แล้ว มันก็จะแสดงให้เห็นว่า มันได้ทำอะไรบ้าง(ดูตามรายละเอียดข้างบนเลย ว่ามันสร้าง files อะไรมาบ้าง และสร้าง folder อะไรมาบ้าง) ทีนี้ เราจะได้ controller มาหนึ่งตัว เข้าไปที่ app/controllers/say_controller.rb แล้วดูข้างใน (เรื่องของ text editor ตอนนี้ตัวใครตัวมันไปก่อนนะครับ) จะได้
class SayController < ApplicationController end |
เราจะได้ SayController ที่เป็น class ว่างๆ ซึ่งสืบทอดมาจาก ApplicationController อีกทีนึง มันจะทำการ generate พวกนี้ให้อย่างอัตโนมัติ คราวนี้เราคงต้องการ code ที่จะมาทำให้ controller เหล่านี้ ไปควบคุม request ที่เข้ามาอีกทีนึง สำหรับตอนนี้ เรายังจะไม่ทำอะไร เราแค่ต้องการ action ว่างๆ ตัวนึง สำหรับ test แล้วเจ้า action ตัวนี้ จะต้องเรียกมันว่าอะไร เรามาดูการคุม request ของ Rails ก่อนดีกว่า
Rails and Request URLs
Rails app ก็เหมือนกับ web app ทั่วๆ ไป มีการใช้ URL ในการชี้ไปที่ต่างๆ แล้วมันจะทำการ generate request ของมันเอง แต่เหมือนจะง่ายๆ แต่ในความเป็นจริง มันมีเรื่องที่ซับซ้อนในการ generate ของพวกนี้ ลองจินตนาการดู ตัว Demo ที่เราสร้างขึ้นใหม่ URL ของมันจะเป็น http://localhost:3000 บน webserver ที่ web app อาศัยอยู่ มันจะมองแยกเป็น paths ดังนี้
Rails จะใช้ path เป็นตัวตัดสินใจว่าจะทำการเรียก controller ไหน แล้วไปที่ action อะไร2 ตามในรูป ถัดจาก localhost:3000 ที่เป็นตัวบอกว่า app เราอยู่ที่ไหน ในส่วนถัดมาจะเป็น path ที่บอกว่าให้ไปที่ controller ไหน แล้ว path ต่อไป จะเป็นตัวบอกว่าให้ไปที่ action อะไร ซึ่ง action ก็คือ method ใน controller class นั่นเอง
First Action
จากที่คุยกันข้างบน เรารู้ว่า action ก็คือ method ใน controller ผมจะใส่ hello action เข้าใน contrller แล้ว แต่ว่า มันจะทำหน้าที่อะไรล่ะ ตอนนี้ เรายังไม่ต้องทำอะไร จำไว้แค่ว่า หน้าที่ของ controller นั้น คือการส่งข้อมูลต่างๆ ไปให้ฝั่ง views แสดง เท่านี้ก็พอ แต่ action ตอนนี้ จะยังไม่ให้มันส่งอะไรไปให้ฝั่ง views ทั้งนั้น เพราะฉะนั้น ใน action ของเรามันจะเป็นแค่ method ว่างๆ มาใส่ action ให้ controller กันดีกว่า เริ่มที่การเปิดไฟล์ say_controller.rb ขึ้นมา มันอยู่ที่ app/controllers จากนั้นก็เพิ่ม hello method เข้าไป ดังนี้
class SayController < ApplicationController def hello end end |
แล้วก็เปิด browser มาลองกันเลย ใส่ address ไปที่ http://localhost:3000/say/hello มันควรจะขึ้นหน้าตาแบบนี้

ระบบแสดงความผิดพลาด ทำงานได้ดีเยี่ยมมมม!!! หลังจากที่เราได้สร้าง controller class และ action method ไปแล้ว แต่เรายังไม่ได้บอกให้ Rails รู้เลยว่าเราจะแสดงอะไร จำด้านบนได้ไหมครับ ตอนที่สร้าง contoller มันจะสร้าง files ขึ้นมา 3 อัน แล้วก็ folder อีกหนึ่งอัน ตัว folder นี้แหละ จะเป็นที่เก็บ files ที่เราเอาไว้แสดงผล แต่เราสร้าง say controller ไป ในฝั่ง view เราจะได้ folder ที่ชือว่า say มา ตามนี้ app/views/say
เกือบเสร็จแล้ว อีกนิดเดียว ต่อไปก็สร้าง template ง่ายๆ ของเราขึ้นมา แต่มีข้อแม้ว่าไฟล์นี้ เราจะต้องสร้างตามชื่อของ action ที่เราสร้างมันขึ้นมา(นี่เป็นอีกหนึ่ง convention ของ Rails) ตาม path นี้ app/veiws/say/hello.rhtml (ทำไมต้อง rhtml เดี๋ยวบอกครับ) ผมจะใส่แบบง่ายๆ เลยนะครับ
1 2 3 4 5 6 7 8 | <html> <head> <title>Hello, Neng!</title> </head> <body> <h1>Hello Neng from Rails!</h1> </body> </html> |
save เป็น hello.rhtml นะครับ ตาม path ที่บอกไปตอนต้น จากนั้น refresh บน browser ของคุณเลย

สำหรับผู้ที่กำลังสับสนกับ folders ต่างๆ อย่าเพิ่งตกใจไปกับมัน มันดูเหมือนจะซับซ้อน แต่จริงๆ แล้วไม่เลยครับ เจอกับมันบ่อยๆ เดี๋ยวก็ชินเอง

คราวหน้าจะมาต่อด้วยการทำให้มันมีความ dynamic มากขึ้น เวทย์มนต์มันค่อยๆ โผล่มาทีละนิดแล้ว
1เรื่องการตั้งชื่อต่างๆ ใน Rails นี้ มันค่อนข้างซับซ้อน ไว้คราวหลัง จะมาเล่าให้ฟังต่อละกันครับ 2ในความเป็นจริง paths ต่างๆ อาจจะดูไม่สวย เราสามารถ override paths พวกนี้ได้ครับ เหมือนเดิม แปะไว้ก่อน จะเล่าอีกทีเมื่อถึงเรื่อง Routing Request
แก้ไขล่าสุด วันที่ 6 กรกฏาคม 2550 เวลา 2.20 น.
ผมทำตามแล้วมัน error อะครับ MissingSourceFile in SayController#hello no such file to load -- sqlite3 RAILS_ROOT: C:/ruby/demo
ตามไปดูใน folder db ก็ว่างเปล่า พอจะมีคำแนะนำไหมครับ