1 การอัพเกรดไปยัง Rails 4.0
หากคุณกำลังอัพเกรดแอปพลิเคชันที่มีอยู่อยู่ ควรมีการทดสอบที่ดีก่อนที่จะเริ่มต้น คุณควรอัพเกรดไปยัง Rails 3.2 ก่อนหากคุณยังไม่ได้ทำ และตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณยังทำงานตามที่คาดหวังก่อนที่จะพยายามอัพเดตไปยัง Rails 4.0 มีรายการสิ่งที่ควรระวังเมื่ออัพเกรดใน คู่มือการอัพเกรด Ruby on Rails
2 การสร้างแอปพลิเคชัน Rails 4.0
# คุณควรมี 'rails' RubyGem ที่ติดตั้งแล้ว
$ rails new myapp
$ cd myapp
2.1 การเก็บ Gems
Rails ใช้ Gemfile
ในรากแอปพลิเคชันเพื่อกำหนด Gems ที่คุณต้องการสำหรับแอปพลิเคชันของคุณในการเริ่มต้น ไฟล์ Gemfile
นี้จะถูกประมวลผลโดย Bundler gem ซึ่งจะติดตั้ง dependencies ทั้งหมดของคุณ มันยังสามารถติดตั้ง dependencies ทั้งหมดไปยังแอปพลิเคชันของคุณเองเพื่อไม่ต้องพึ่งพากับ system gems
ข้อมูลเพิ่มเติม: Bundler homepage
2.2 อยู่ในส่วนของการพัฒนา
Bundler
และ Gemfile
ทำให้การแชร์แอปพลิเคชัน Rails ของคุณเป็นเรื่องง่ายดายด้วยคำสั่ง bundle
ที่เป็นเฉพาะ หากคุณต้องการแชร์โดยตรงจาก Git repository คุณสามารถส่งผ่าน flag --edge
:
$ rails new myapp --edge
หากคุณมีการ checkout ท้องถิ่นของเก็บรักษา Rails และต้องการสร้างแอปพลิเคชันโดยใช้มัน คุณสามารถส่งผ่าน flag --dev
:
$ ruby /path/to/rails/railties/bin/rails new myapp --dev
คุณสามารถอ่านเพิ่มเติมได้ที่ เอกสารปล่อยตัว Rails 4.0
คุณสามารถอ่านเพิ่มเติมได้ที่ เอกสารปล่อยตัว Rails 4.0
2.3 การอัพเกรด
- Ruby 1.9.3 (คอมมิต) - แนะนำให้ใช้ Ruby 2.0; ต้องการ 1.9.3 ขึ้นไป
- นโยบายการเลิกใช้งานใหม่ - คุณสมบัติที่ถูกเลิกใช้งานจะเป็นคำเตือนใน Rails 4.0 และจะถูกลบออกใน Rails 4.1
- ActionPack page และ action caching (คอมมิต) - Page และ action caching ถูกแยกออกเป็น gem แยก Page และ action caching ต้องการการแก้ไขด้วยตนเองมากเกินไป (ต้องลบแคชด้วยตนเองเมื่อวัตถุโมเดลหลักที่อยู่ภายใต้มันถูกอัพเดต) แทนที่จะใช้ Russian doll caching
- ActiveRecord observers (คอมมิต) - Observers ถูกแยกออกเป็น gem แยก Observers จำเป็นเฉพาะสำหรับ Page และ action caching และสามารถนำไปสู่การเขียนโค้ดที่ซับซ้อนได้
- ActiveRecord session store (คอมมิต) - ActiveRecord session store ถูกแยกออกเป็น gem การเก็บ session ใน SQL เป็นการใช้ทรัพยากรมาก แทนที่จะใช้ cookie sessions, memcache sessions หรือ custom session store
- ActiveModel mass assignment protection (คอมมิต) - Rails 3 mass assignment protection ถูกเลิกใช้งาน แทนที่ให้ใช้ strong parameters
- ActiveResource (คอมมิต) - ActiveResource ถูกแยกออกเป็น gem ActiveResource ไม่ได้ถูกใช้งานอย่างแพร่หลาย
vendor/plugins ถูกลบออก (คอมมิต) - ใช้
Gemfile
เพื่อจัดการกับ gems ที่ติดตั้งActionPack
พารามิเตอร์ที่แข็งแกร่ง (commit) - อนุญาตเฉพาะพารามิเตอร์ที่ได้รับอนุญาตให้อัปเดตอ็อบเจกต์โมเดล (
params.permit(:title, :text)
).Routing concerns (commit) - ใน DSL ของการเรียกเส้นทาง, แยกออกจากเส้นทางย่อยที่ซ้ำกัน (
comments
จาก/posts/1/comments
และ/videos/1/comments
).ActionController::Live (commit) - สตรีม JSON ด้วย
response.stream
.Declarative ETags (commit) - เพิ่มการเพิ่ม etag ระดับคอนโทรลเลอร์ที่จะเป็นส่วนหนึ่งของการคำนวณ etag ของแอ็กชัน.
การแคชแบบหุ่นรุ่นรัสเซีย (commit) - แคชส่วนย่อยของวิว. แต่ละส่วนย่อยหมดอายุตามขึ้นตอนขึ้นอยู่กับชุดขึ้นตอน (คีย์แคช). คีย์แคช通常เป็นหมายเลขเวอร์ชันเทมเพลตและออบเจกต์โมเดล.
Turbolinks (commit) - เซิร์ฟเฉพาะหน้า HTML เริ่มต้นเพียงหนึ่งหน้า. เมื่อผู้ใช้นำทางไปยังหน้าอื่น ใช้ pushState เพื่ออัปเดต URL และใช้ AJAX เพื่ออัปเดตไตเติลและเนื้อหา.
แยก ActionView จาก ActionController (commit) - ActionView ถูกแยกออกจาก ActionPack และจะถูกย้ายไปเป็นแพ็คเกจแยกต่างหากใน Rails 4.1.
ไม่ต้องพึ่งพา ActiveModel (commit) - ActionPack ไม่พึ่งพา ActiveModel อีกต่อไป.
2.4 ทั่วไป
- ActiveModel::Model (commit) -
ActiveModel::Model
, การผสมผสานเพื่อให้วัตถุธรรมดาใน Ruby ทำงานกับ ActionPack ได้โดยอัตโนมัติ (เช่นสำหรับform_for
) - API ขอบเขตใหม่ (commit) - ขอบเขตต้องใช้เฉพาะเรียกได้เสมอ.
- การเก็บแคชสกีมา (commit) - เพื่อปรับปรุงเวลาเริ่มต้นของ Rails, แทนที่จะโหลดสกีมาโดยตรงจากฐานข้อมูล, โหลดสกีมาจากไฟล์ดัมป์.
- สนับสนุนการระบุระดับการแยกการทำงาน (commit) - เลือกว่าการอ่านซ้ำหรือประสิทธิภาพที่ดีขึ้น (การล็อกน้อยลง) สำคัญกว่า.
- Dalli (commit) - ใช้ไคลเอ็นต์ memcache ของ Dalli สำหรับการจัดเก็บ memcache.
- การเริ่มต้นและการสิ้นสุดการแจ้งเตือน (commit) - Active Support instrumentation รายงานการแจ้งเตือนเริ่มต้นและการสิ้นสุดให้กับผู้ติดตาม.
- ปลอดภัยสำหรับเธรดโดยค่าเริ่มต้น (commit) - Rails สามารถทำงานในเซิร์ฟเวอร์แอปพลิเคชันที่มีเธรดได้โดยไม่ต้องกำหนดค่าเพิ่มเติม.
หมายเหตุ: ตรวจสอบว่าแพ็คเกจที่คุณกำลังใช้เป็นปลอดภัยสำหรับเธรดหรือไม่. * PATCH verb (commit) - ใน Rails PATCH จะแทนที่ PUT ใช้สำหรับการอัปเดตข้อมูลบางส่วนของทรัพยากร
2.5 ความปลอดภัย
- match do not catch all (commit) - ใน DSL ของการเรียกใช้เส้นทาง ต้องระบุ HTTP verb หรือ verbs
- html entities escaped by default (commit) - สตริงที่แสดงผลใน erb จะถูกหนีไว้เว้นแต่ถ้าใช้
raw
หรือเรียกใช้html_safe
- New security headers (commit) - Rails ส่ง headers ต่อไปนี้พร้อมกับทุก HTTP request:
X-Frame-Options
(ป้องกันการ clickjacking โดยไม่อนุญาตให้เบราว์เซอร์ฝังหน้าเว็บในเฟรม),X-XSS-Protection
(ขอให้เบราว์เซอร์หยุดการฝังสคริปต์) และX-Content-Type-Options
(ป้องกันเบราว์เซอร์เปิดไฟล์ jpeg เป็น exe)
3 การแยกคุณสมบัติเป็นแพ็คเกจย่อย
ใน Rails 4.0 มีการแยกคุณสมบัติบางอย่างเป็นแพ็คเกจย่อย คุณสามารถเพิ่มแพ็คเกจย่อยที่แยกออกมาใน Gemfile
เพื่อให้ได้ความสามารถเดิมกลับมาใช้งานได้
- Hash-based & Dynamic finder methods (GitHub)
- Mass assignment protection in Active Record models (GitHub, Pull Request)
- ActiveRecord::SessionStore (GitHub, Pull Request)
- Active Record Observers (GitHub, Commit)
- Active Resource (GitHub, Pull Request, Blog)
- Action Caching (GitHub, Pull Request)
- Page Caching (GitHub, Pull Request)
- Sprockets (GitHub)
- Performance tests (GitHub, Pull Request)
4 เอกสาร
ไกด์ถูกเขียนใหม่ในรูปแบบ GitHub Flavored Markdown
ไกด์มีการออกแบบให้เหมาะสมกับหน้าจอที่ตอบสนอง
5 Railties
โปรดอ้างอิงที่ Changelog เพื่อดูการเปลี่ยนแปลงที่ละเอียด
5.1 การเปลี่ยนแปลงที่สำคัญ
ตำแหน่งทดสอบใหม่
test/models
,test/helpers
,test/controllers
, และtest/mailers
ถูกเพิ่มเข้ามา รวมถึง rake tasks ที่เกี่ยวข้อง (Pull Request)โปรแกรมที่ใช้ในแอปของคุณตอนนี้อยู่ในไดเรกทอรี
bin/
รันrake rails:update:bin
เพื่อรับbin/bundle
,bin/rails
, และbin/rake
Threadsafe เปิดใช้งานโดยค่าเริ่มต้น
ไม่สามารถใช้ builder ที่กำหนดเองได้โดยใช้
--builder
(หรือ-b
) กับrails new
ได้ ควรพิจารณาใช้เทมเพลตแอปพลิเคชันแทน (Pull Request)
5.2 การเลิกใช้งาน
config.threadsafe!
ถูกเลิกใช้แล้ว แนะนำให้ใช้config.eager_load
ซึ่งให้ควบคุมการโหลดแบบละเอียดมากกว่าRails::Plugin
ได้ถูกยกเลิก แทนที่จะเพิ่มปลั๊กอินในvendor/plugins
ให้ใช้ gem หรือ bundler พร้อมกับการระบุ path หรือ git dependencies
6 Action Mailer
โปรดอ้างอิงที่ Changelog เพื่อดูการเปลี่ยนแปลงที่ละเอียด
6.1 การเปลี่ยนแปลงที่สำคัญ
6.2 การเลิกใช้
7 Active Model
โปรดอ้างอิงที่ Changelog เพื่อดูการเปลี่ยนแปลงที่ละเอียด
7.1 การเปลี่ยนแปลงที่สำคัญ
เพิ่ม
ActiveModel::ForbiddenAttributesProtection
, โมดูลที่เรียกใช้งานง่ายเพื่อป้องกันการกำหนดค่าแบบมวลส่วนเมื่อมีการส่งค่าที่ไม่ได้รับอนุญาตเพิ่ม
ActiveModel::Model
, การผสมผสานเพื่อทำให้วัตถุ Ruby ทำงานกับ Action Pack ได้อย่างง่ายดาย
7.2 การเลิกใช้
8 Active Support
โปรดอ้างอิงที่ Changelog เพื่อดูการเปลี่ยนแปลงที่ละเอียด
8.1 การเปลี่ยนแปลงที่สำคัญ
แทนที่ gem
memcache-client
ที่ถูกยกเลิกด้วยdalli
ในActiveSupport::Cache::MemCacheStore
ปรับปรุง
ActiveSupport::Cache::Entry
เพื่อลดการใช้หน่วยความจำและการประมวลผลสามารถกำหนด Inflections ตามภาษาได้แล้ว
singularize
และpluralize
รับ locale เป็นอาร์กิวเมนต์เพิ่มเติมObject#try
จะส่งคืนค่า nil แทนที่จะเกิด NoMethodError หากวัตถุที่รับได้ไม่มีการนำเสนอเมธอด แต่คุณยังสามารถใช้พฤติกรรมเดิมได้โดยใช้Object#try!
ใหม่String#to_date
ตอนนี้จะเกิดArgumentError: invalid date
แทนที่จะเกิดNoMethodError: undefined method 'div' for nil:NilClass
เมื่อได้รับวันที่ที่ไม่ถูกต้อง ตอนนี้เหมือนกับDate.parse
และยอมรับวันที่ที่ไม่ถูกต้องมากกว่า 3.x เช่น:# ActiveSupport 3.x "asdf".to_date # => NoMethodError: undefined method `div' for nil:NilClass "333".to_date # => NoMethodError: undefined method `div' for nil:NilClass # ActiveSupport 4 "asdf".to_date # => ArgumentError: invalid date "333".to_date # => Fri, 29 Nov 2013
8.2 การเลิกใช้
เลิกใช้เมธอด
ActiveSupport::TestCase#pending
, ใช้skip
จาก minitest แทนActiveSupport::Benchmarkable#silence
ถูกเลิกใช้เนื่องจากขาดความปลอดภัยในเรื่องของเธรด จะถูกลบโดยไม่มีการแทนที่ใน Rails 4.1ActiveSupport::JSON::Variable
ถูกเลิกใช้ กำหนด#as_json
และ#encode_json
เองสำหรับสตริงลิตเตอรัล JSON ที่กำหนดเองเลิกใช้เมธอดที่เข้ากันได้
Module#local_constant_names
, ใช้Module#local_constants
แทน (ที่ส่งคืนสัญลักษณ์)ActiveSupport::BufferedLogger
ถูกยกเลิกการใช้งานแล้ว ให้ใช้ActiveSupport::Logger
หรือ logger จากไลบรารีมาตรฐานของ Ruby แทนเลิกใช้
assert_present
และassert_blank
และใช้assert object.blank?
และassert object.present?
แทน
9 Action Pack
โปรดอ้างอิงที่ Changelog สำหรับการเปลี่ยนแปลงที่ละเอียด
9.1 การเปลี่ยนแปลงที่สำคัญ
- เปลี่ยนสไตล์ชีทสตายเลขของหน้าข้อผิดพลาดสำหรับโหมดการพัฒนา แสดงเพิ่มเติมเช่นบรรทัดของโค้ดและชิ้นส่วนที่เกิดข้อผิดพลาดในหน้าข้อผิดพลาดทั้งหมด
9.2 การเลิกใช้งาน
10 Active Record
โปรดอ้างอิงที่ Changelog สำหรับการเปลี่ยนแปลงที่ละเอียด
10.1 การเปลี่ยนแปลงที่สำคัญ
ปรับปรุงวิธีการเขียน migration
change
ทำให้ไม่จำเป็นต้องใช้up
และdown
เดิมอีกต่อไป- เมธอด
drop_table
และremove_column
สามารถย้อนกลับได้ตามที่กำหนดไว้ ถ้ามีข้อมูลที่จำเป็น เมธอดremove_column
เคยรับชื่อคอลัมน์หลายคอลัมน์ แต่ในตอนนี้ให้ใช้remove_columns
(ซึ่งไม่สามารถย้อนกลับได้) เมธอดchange_table
ย้อนกลับได้เช่นกัน ถ้าบล็อกของมันไม่เรียกใช้remove
change
หรือchange_default
- เมธอดใหม่
reversible
ทำให้เป็นไปได้ที่จะระบุโค้ดที่จะทำงานเมื่อทำการเพิ่มหรือลด migration ดูเพิ่มเติมที่ Guide on Migration - เมธอดใหม่
revert
จะย้อนกลับ migration ทั้งหมดหรือบล็อกที่กำหนด ถ้าทำการย้อนกลับ migration บล็อกที่กำหนดจะทำงานตามปกติ ดูเพิ่มเติมที่ Guide on Migration
- เมธอด
เพิ่มการสนับสนุนชนิดข้อมูล array ของ PostgreSQL สามารถใช้ชนิดข้อมูลใดก็ได้ในการสร้างคอลัมน์แบบ array พร้อมการสนับสนุนการเปลี่ยนแปลง migration และ schema dumper ทั้งหมด
เพิ่ม
Relation#load
เพื่อโหลดเรคคอร์ดและคืนค่าself
โดยชัดเจนModel.all
ตอนนี้คืนค่าเป็นActiveRecord::Relation
แทนที่จะเป็นอาร์เรย์ของเรคคอร์ด ใช้Relation#to_a
หากต้องการอาร์เรย์จริง ในบางกรณีเฉพาะนี้อาจทำให้เกิดปัญหาเมื่ออัพเกรดเพิ่ม
ActiveRecord::Migration.check_pending!
ซึ่งจะเรียกขึ้นข้อผิดพลาดหากมี migration ที่รอดำเนินการเพิ่มการสนับสนุน custom coders สำหรับ
ActiveRecord::Store
ตอนนี้คุณสามารถตั้งค่า custom coder ได้ดังนี้:store :settings, accessors: [ :color, :homepage ], coder: JSON
การเชื่อมต่อ
mysql
และmysql2
จะตั้งค่าSQL_MODE=STRICT_ALL_TABLES
เป็นค่าเริ่มต้นเพื่อป้องกันการสูญเสียข้อมูลที่เกิดขึ้นโดยไม่มีเสียง เราสามารถปิดการใช้งานนี้ได้โดยระบุstrict: false
ในdatabase.yml
ของคุณลบ IdentityMap
ลบการทำงานอัตโนมัติของคำสั่ง EXPLAIN ตัวเลือก
active_record.auto_explain_threshold_in_seconds
ไม่ได้ใช้แล้วและควรลบออกเพิ่ม
ActiveRecord::NullRelation
และActiveRecord::Relation#none
ที่นำเสนอรูปแบบวัตถุที่เป็นค่าว่างสำหรับคลาส Relationเพิ่มการช่วยเหลือการเชื่อมต่อ HABTM โดยใช้การเคลื่อนย้ายตาราง join
อนุญาตให้สร้างบันทึก hstore ใน PostgreSQL
10.2 การเลิกใช้งาน
เลิกใช้งาน API แบบเก่าที่ใช้แฮชเป็นพารามิเตอร์ค้นหา นั่นหมายความว่าเมธอดที่ก่อนหน้านี้ยอมรับ "ตัวเลือกค้นหา" จะไม่ทำงานอีกต่อไป
เลิกใช้งานเมธอดแบบไดนามิกทั้งหมดยกเว้น
find_by_...
และfind_by_...!
นี่คือวิธีการเขียนโค้ดใหม่:find_all_by_...
สามารถเขียนใหม่โดยใช้where(...)
find_last_by_...
สามารถเขียนใหม่โดยใช้where(...).last
scoped_by_...
สามารถเขียนใหม่โดยใช้where(...)
find_or_initialize_by_...
สามารถเขียนใหม่โดยใช้find_or_initialize_by(...)
find_or_create_by_...
สามารถเขียนใหม่โดยใช้find_or_create_by(...)
find_or_create_by_...!
สามารถเขียนใหม่โดยใช้find_or_create_by!(...)
11 เครดิต
ดู รายชื่อผู้มีส่วนร่วมทั้งหมดใน Rails สำหรับผู้ที่ใช้เวลาหลายชั่วโมงในการสร้าง Rails เป็นเฟรมเวิร์กที่เสถียรและทนทาน ยินดีด้วยทุกคน
ข้อเสนอแนะ
คุณสามารถช่วยปรับปรุงคุณภาพของคู่มือนี้ได้
กรุณาช่วยเพิ่มเติมหากพบข้อผิดพลาดหรือข้อผิดพลาดทางความจริง เพื่อเริ่มต้นคุณสามารถอ่านส่วน การสนับสนุนเอกสาร ของเราได้
คุณอาจพบเนื้อหาที่ไม่สมบูรณ์หรือเนื้อหาที่ไม่ได้อัปเดต กรุณาเพิ่มเอกสารที่ขาดหายไปสำหรับเนื้อหาหลัก โปรดตรวจสอบ Edge Guides ก่อนเพื่อตรวจสอบ ว่าปัญหาได้รับการแก้ไขหรือไม่ในสาขาหลัก ตรวจสอบ คู่มือแนวทาง Ruby on Rails เพื่อดูรูปแบบและกฎเกณฑ์
หากคุณพบข้อผิดพลาดแต่ไม่สามารถแก้ไขได้เอง กรุณา เปิดปัญหา.
และสุดท้าย การสนทนาใด ๆ เกี่ยวกับ Ruby on Rails เอกสารยินดีต้อนรับที่สุดใน เว็บบอร์ดอย่างเป็นทางการของ Ruby on Rails.