Monday, May 15, 2006

Rails Memo #1

ผลพวงจาก Blognone SIG #1 ก็เลยกลับมานั่งเขียน Memo
ผู้เรียนทั้งหลายจะได้มีไว้ทบทวนกันลืม
(เพื่อไม่ให้งง ผมจะอธิบายถึง default assumption ก่อน
กรณี exception หรือ customize จะยังไม่พูดถึง)

เริ่มด้วยเรื่องแรกสุดก่อน ก็คือ Controller และ View

ประเด็นแรก
เริ่มที่เรื่องชื่อของ controller ก่อน
ยกตัวอย่าง
class ProductsController
จะถูกเก็บไว้ใน file products_controller.rb

class HomeController
จะถูกเก็บไว้ใน file home_controller.rb

กรณีที่ชื่อประกอบจากหลายคำ เช่น
class AdminAreaController
ชื่อ file ก็ต้องเป็น admin_area_controller.rb

class PropertiesAdminController
ชื่อ file ก็ต้องเป็น properties_admin_controller.rb

Note: ที่ระดับ controller นี้ จะไม่มีประเด็นเรื่องพหูพจน์หรือเอกพจน์มาเกี่ยวข้อง
(อยากตั้งชื่ออย่างไรก็ว่าไป)

เมื่อเข้าใจวิธีตั้งชื่อแล้ว ก็มาถึงวิธี map url เข้ากับ controller
หลักการก็คือ path แรกสุดของ url จะถูก map เข้ากับ controller
เช่น
http://host:port/products
จะเรียกใช้ controller ProductController

http://host:port/home
อันนี้จะเรียกใช้ class HomeController

http://host:port/admin_area
=> class AdminAreaController

http://host:port/products_admin
=> class ProductsAdminController

url ที่ browser ส่งเข้ามานั้น
Rails คาดหวังว่าจะมีการระบุ action หรือ method มาด้วย เช่น
http://host:port/products/list
ในกรณีนี้ "list" ก็คือชื่อ action(method) ที่ต้องการเรียกใช้
หลักการที่ rails ใช้ solve สำหรับชื่อ action ก็คือ
  • ถ้า controller นั้นมี method ที่ชื่อว่า list อยู่
    ,method นั้นก็จะถูกเรียกใช้
  • กรณีที่ controller นั้นไม่มี method ที่ชื่อ list
    ,rails ก็จะ bypass controller และส่งต่อให้ view ที่ชื่อ list.rhtml ทำงานแทน


แต่ถ้าเราไม่ระบุ action มาเลย เช่น
http://host:port/products
,Rails ก็จะเรียกใช้ default action ที่ชื่อ index


ประเด็นที่สองก็คือ เรื่อง
ความสัมพันธ์ระหว่าง ชื่อของ Controller กับ
Directory ที่เก็บ View
สมมติว่า url ที่เรียกเข้ามามีหน้าตาแบบนี้
http://host:port/products/list
Rails จะมองหา view ที่ชื่อ list.rhtml
ที่เก็บอยู่ภายใต้ Directory $PROJECT/app/views/products/

จะเห็นว่าชื่อ Directory ที่เก็บ View จะเป็นชื่อเดียวกับ Controller

Related link from Roti

3 comments:

OHM said...

อืม... พึ่งเข้าใจ

ทำไมเมื่อวานไม่เข้าใจแบบนี้ หรือว่าคลุกวงในมากเกินไป เลยเกิดอาการเมาหมัด

ดูรูปด้านล่างเสร็จปุ๊บ...อ๋อ มันเป็นอย่างนี้นี่เอง

ขอบคุณครับ เดี๋ยวจะรอตอนต่อไปนะครับ (กดดันนิด ๆ ^ ^)

polawat phetra said...

อันนี้แหล่ะที่อยากให้เกิด
เมื่อวานตั้งใจให้เกิดอาการ วน loop ในหัว
หาทางออกไม่ได้

ถ้าเราหมกมุ่นมากพอ
จิตใต้สำนึกจะเริ่มเก็บประเด็นนั้นลงไปคิด

ดังนั้นวันนี้แค่เห็นรูป
(ไม่ต้องอ่านคำอธิบาย ยังได้เลย)
ก็จะเกิดอาการปิ๊งนิดๆ ขึ้นมา

revolution said...

RoR นี่มีที่กำหนด concurrent conenction ให้แต่ละ framework ไหมครับ เพราะเท่าที่ลองยิงดู 100 concurrent connection ก็ error 503 แล้วอะครับ

ผมใช้ apache2.0+ruby1.84+mod_fcgi นะครับ