Translations of this page?:

มีการเปลี่ยนแปลงที่ค่อนข้างใหญ่กับสถาปัตยกรรมของ Rails สองอย่าง คือการสนับสนุนการทำงานร่วมกันกับ Rack ซึ่งเป็นอินเตอร์เฟสเพื่อเชื่อมเว็บแอพพลิเคชั่นเฟรมเวิร์คกับเว็บเซิร์ฟเวอร์ และการกลับมาสนับสนุน Rails Engines อีกครั้ง

1.1. การทำงานร่วมกับ Rack

Rails ได้ยกเลิกการทำงานกับ CGI แบบเก่าและได้เปลี่ยนมาใช้ Rack ในทุกๆที่แล้ว การเปลี่ยนแปลงครั้งนี้ทำให้ต้องมีการจัดสถาปัตยกรรมภายในใหม่เยอะมาก (ไม่ต้องห่วงถ้าคุณยังใช้ CGI แบบเก่าอยู่เพราะ Rails สนับสนุนการทำงานกับ CGI ผ่านอินเตอร์เฟสพร๊อกซี่แทน) หลังจากคุณอัพเกรดเป็นเวอร์ชั่น 2.3 แล้วคุณควรทดสอบทั้งในสภาพแวดล้อมสำหรับพัฒนาและสภาพแวดล้อม production โดยลองทดสอบส่วนเหล่านี้:

  • เซสชั่น
  • คุ๊กกี้
  • การอัพโหลดไฟล์
  • JSON/XML APIs

สรุปการแก้ไขที่เกี่ยวข้องกับ rack ได้ดังนี้:

  • script/server ถูกเปลี่ยนมาใช้ Rack ซึ่งหมายความคุณสามารถใช้เซิร์ฟเวอร์ใดๆที่ทำงานกับ Rack ได้ นอกจากนั้น script/server ยังจะใช้ไฟล์ rackup ถ้ามี ซึ่งโดยปกติสคริปต์จะมองหาไฟล์ชื่อ config.ru แต่คุณสามารถใช้ไฟล์ที่ระบุเองโดยใช้สวิตช์ -c ก็ได้
  • Handler สำหรับ FCGI ทำงานผ่าน Rack แล้ว
  • ActionController::Dispatcher จะมี stack มิดเดิลแวร์ดีฟอล์ต คุณสามารถเพิ่มมิดเดิลแวร์ จัดเรียงลำดับการทำงานของมิดเดิลแวร์ และเอามิดเดิลแวร์ออกจาก stack โดยแก้ไขค่าในไฟล์ environment.rb Rails จะคอมไพล์มิดเดิลแวร์ต่างๆเป็นลำดับเมื่อบู๊ต
  • มี task ใหม่คือ rake middleware สำหรับใช้เพื่อดูว่ามีมิดเดิลแวร์อะไรอยู่ใน stack บ้าง เหมาะสำหรับการใช้เพื่อดีบั๊กลำดับการทำงานของมิดเดิลแวร์ใน stack
  • integration test ถูกแก้ไขให้ใช้งานมิดเดิลแวร์ทั้งหมดใน stack ทำให้ integration test เหมาะกับการใช้สำหรับทดสอบมิดเดิลแวร์ต่างๆได้
  • ActionController::CGIHandler สามารถทำงานกับ CGI wrapper ของ Rack ได้ และคุณสามารถใช้ CGIHandler เพื่อรับออบเจ็คต์ CGI แบบเก่าและแปลงเป็นรูปแบบสำหรับใช้งานกับ Rack ได้
  • CgiRequest และ CgiResponse ถูกลบออกไปแล้ว
  • Rails จะโหลด session stores เมื่อต้องการเท่านั้น ถ้าคุณไม่ได้ใช้ session ตอนตอบ request เลย Rails จะไม่โหลดข้อมูลเซสชั่นขึ้นมา (parse คุ๊กกี้, โหลดข้อมูลจาก memcache, หรือคิวรี่ออบเจ็คต์ Active Record)
  • CGI::Session::CookieStore ถูกแทนที่ด้วย ActionController::Session::CookieStore
  • CGI::Session::MemCacheStore ถูกแทนที่ด้วย ActionController::Session::MemCacheStore
  • CGI::Session::ActiveRecordStore ถูกแทนที่ด้วย ActiveRecord::SessionStore
  • คุณสามารถเปลี่ยน session store โดยเซ็ต ActionController::Base.session_store = :active_record_store
  • คุณสามารถเปลี่ยนค่าเสริมสำหรับดีฟอล์ตเซสชั่นโดยใช้ ActionController::Base.session = { :key ⇒ ”…” }
  • mutex ที่ครอบ request ของคุณถูกย้ายไปในมิดเดิลแวร์ ActionController::Lock
  • ActionController::AbstractRequest ได้ถูกรวมกับ ActionController::Request และ ActionController::Request ถูกเปลี่ยนให้ inherit จาก Rack::Request การเปลี่ยนแปลงนี้กระทบกับการใช้งาน response.headers[type] ในการทดสอบ ให้ใช้ response.content_type แทน
  • มิดเดิลแวร์ ActiveRecord::QueryCache จะถูกแทรกเข้าไปใน stack โดยอัตโนมัติถ้า ActiveRecord ถูกโหลดมาใช้งาน หน้าที่ของมิดเดิลแวร์นี้คือการ flush คิวรี่แคชของ Active Record สำหรับแต่ละ request
  • คลาส router และ controller ต่างๆใช้สเปคของ Rack เป็นมาตรฐาน หมายความว่าคุณสามารถเรียกใช้ controller โดยตรงโดยเรียก SomeController.call(env) พารามิเตอร์ต่างๆเกี่ยวกับ router จะอยู่ใน rack.routing_args
  • ActionController::Request ถูกเปลี่ยนให้ inherit จาก Rack::Request แล้ว
  • แทนที่จะใช้ config.action_controller.session = { :session_key ⇒ foo, … ให้ใช้ config.action_controller.session = { :key ⇒ foo, … แทน
  • การใช้มิดเดิลแวร์ ParamsParser จะทำการประมวลผล request สำหรับ XML, JSON, หรือ YAML ใดๆก่อน ทำให้ request เหล่านั้นสามารถถูกนำไปใช้งานกับ Rack::Request อื่นๆต่อไป

1.2. การกลับมาสนับสนุน Rails Engines อีกครั้ง

หลังจากหยุดนิ่งไปหลายเวอร์ชั่นโดยไม่มีการอัพเกรด Rails 2.3 ได้เพิ่มฟีเจอร์ใหม่ๆสำหรับ Rails Engines (แอพพลิเคชั่น Rails ที่สามารถถูก embed ไว้ในแอพพลิเคชั่นอื่นๆ) ก่อนอื่นไฟล์ routing ใน engine จะถูกโหลดใหม่โดยอัตโนมัติถ้าไฟล์ถูกแก้ไข เหมือนกับไฟล์ routes.rb (ซึ่งจะมีผลสำหรับไฟล์ routing ของปลั๊กอินอื่นๆด้วย) อย่างที่สองคือ ถ้าปลั๊กอินมีไดเร็คทอรี่ย่อยชื่อ app แล้ว Rails จะเพิ่ม app/[models|controllers|helpers] ใน load path โดยอัตโนมัติ นอกจากนั้น engine ยังสนับสนุนการเพิ่ม view path แล้ว

 
th/releases/rails2dot3/application-architecture.txt · แก้ไขครั้งล่าสุด: 2009/02/16 14:03 โดย sukit
 
Recent changes RSS feed Creative Commons License