edge
เพิ่มเติมที่ rubyonrails.org: เพิ่มเติมเกี่ยวกับ Ruby on Rails

เอกสารปล่อยตัวของ Ruby on Rails 4.0

จุดเด่นใน Rails 4.0:

เอกสารปล่อยตัวนี้ครอบคลุมเฉพาะการเปลี่ยนแปลงที่สำคัญเท่านั้น หากต้องการเรียนรู้เกี่ยวกับการแก้ไขข้อบกพร่องและการเปลี่ยนแปลงต่างๆ โปรดอ้างอิงที่ changelogs หรือตรวจสอบ รายการคอมมิต ในเก็บรักษาหลักของ Rails ใน GitHub

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 เพื่อให้ได้ความสามารถเดิมกลับมาใช้งานได้

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.1

  • ActiveSupport::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.