มีการเปลี่ยนแปลงที่ค่อนข้างใหญ่กับสถาปัตยกรรมของ Rails สองอย่าง คือการสนับสนุนการทำงานร่วมกันกับ Rack ซึ่งเป็นอินเตอร์เฟสเพื่อเชื่อมเว็บแอพพลิเคชั่นเฟรมเวิร์คกับเว็บเซิร์ฟเวอร์ และการกลับมาสนับสนุน Rails Engines อีกครั้ง
Rails ได้ยกเลิกการทำงานกับ CGI แบบเก่าและได้เปลี่ยนมาใช้ Rack ในทุกๆที่แล้ว การเปลี่ยนแปลงครั้งนี้ทำให้ต้องมีการจัดสถาปัตยกรรมภายในใหม่เยอะมาก (ไม่ต้องห่วงถ้าคุณยังใช้ CGI แบบเก่าอยู่เพราะ Rails สนับสนุนการทำงานกับ CGI ผ่านอินเตอร์เฟสพร๊อกซี่แทน) หลังจากคุณอัพเกรดเป็นเวอร์ชั่น 2.3 แล้วคุณควรทดสอบทั้งในสภาพแวดล้อมสำหรับพัฒนาและสภาพแวดล้อม production โดยลองทดสอบส่วนเหล่านี้:
สรุปการแก้ไขที่เกี่ยวข้องกับ rack ได้ดังนี้:
script/server ถูกเปลี่ยนมาใช้ Rack ซึ่งหมายความคุณสามารถใช้เซิร์ฟเวอร์ใดๆที่ทำงานกับ Rack ได้ นอกจากนั้น script/server ยังจะใช้ไฟล์ rackup ถ้ามี ซึ่งโดยปกติสคริปต์จะมองหาไฟล์ชื่อ config.ru แต่คุณสามารถใช้ไฟล์ที่ระบุเองโดยใช้สวิตช์ -c ก็ได้ActionController::Dispatcher จะมี stack มิดเดิลแวร์ดีฟอล์ต คุณสามารถเพิ่มมิดเดิลแวร์ จัดเรียงลำดับการทำงานของมิดเดิลแวร์ และเอามิดเดิลแวร์ออกจาก stack โดยแก้ไขค่าในไฟล์ environment.rb Rails จะคอมไพล์มิดเดิลแวร์ต่างๆเป็นลำดับเมื่อบู๊ตrake middleware สำหรับใช้เพื่อดูว่ามีมิดเดิลแวร์อะไรอยู่ใน stack บ้าง เหมาะสำหรับการใช้เพื่อดีบั๊กลำดับการทำงานของมิดเดิลแวร์ใน stackActionController::CGIHandler สามารถทำงานกับ CGI wrapper ของ Rack ได้ และคุณสามารถใช้ CGIHandler เพื่อรับออบเจ็คต์ CGI แบบเก่าและแปลงเป็นรูปแบบสำหรับใช้งานกับ Rack ได้CgiRequest และ CgiResponse ถูกลบออกไปแล้วCGI::Session::CookieStore ถูกแทนที่ด้วย ActionController::Session::CookieStoreCGI::Session::MemCacheStore ถูกแทนที่ด้วย ActionController::Session::MemCacheStoreCGI::Session::ActiveRecordStore ถูกแทนที่ด้วย ActiveRecord::SessionStoreActionController::Base.session_store = :active_record_storeActionController::Base.session = { :key ⇒ ”…” }ActionController::LockActionController::AbstractRequest ได้ถูกรวมกับ ActionController::Request และ ActionController::Request ถูกเปลี่ยนให้ inherit จาก Rack::Request การเปลี่ยนแปลงนี้กระทบกับการใช้งาน response.headers[type] ในการทดสอบ ให้ใช้ response.content_type แทนActiveRecord::QueryCache จะถูกแทรกเข้าไปใน stack โดยอัตโนมัติถ้า ActiveRecord ถูกโหลดมาใช้งาน หน้าที่ของมิดเดิลแวร์นี้คือการ flush คิวรี่แคชของ Active Record สำหรับแต่ละ requestSomeController.call(env) พารามิเตอร์ต่างๆเกี่ยวกับ router จะอยู่ใน rack.routing_argsActionController::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 อื่นๆต่อไป
หลังจากหยุดนิ่งไปหลายเวอร์ชั่นโดยไม่มีการอัพเกรด Rails 2.3 ได้เพิ่มฟีเจอร์ใหม่ๆสำหรับ Rails Engines (แอพพลิเคชั่น Rails ที่สามารถถูก embed ไว้ในแอพพลิเคชั่นอื่นๆ) ก่อนอื่นไฟล์ routing ใน engine จะถูกโหลดใหม่โดยอัตโนมัติถ้าไฟล์ถูกแก้ไข เหมือนกับไฟล์ routes.rb (ซึ่งจะมีผลสำหรับไฟล์ routing ของปลั๊กอินอื่นๆด้วย) อย่างที่สองคือ ถ้าปลั๊กอินมีไดเร็คทอรี่ย่อยชื่อ app แล้ว Rails จะเพิ่ม app/[models|controllers|helpers] ใน load path โดยอัตโนมัติ นอกจากนั้น engine ยังสนับสนุนการเพิ่ม view path แล้ว
Discussion