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

เนื้อหาสำคัญใน Rails 4.2:

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

1 การอัปเกรดไปยัง Rails 4.2

หากคุณกำลังอัปเกรดแอปพลิเคชันที่มีอยู่ ควรมีการทดสอบที่ดีก่อนที่จะเริ่มต้น คุณควรอัปเกรดเป็น Rails 4.1 ก่อนหากคุณยังไม่ได้ทำ และตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณยังทำงานตามที่คาดหวังก่อนที่จะพยายามอัปเกรดไปเป็น Rails 4.2 มีรายการสิ่งที่ควรระวังเมื่ออัปเกรดในเอกสาร การอัปเกรด Ruby on Rails

2 คุณลักษณะหลัก

2.1 Active Job

Active Job เป็นเฟรมเวิร์กใหม่ใน Rails 4.2 มันเป็นอินเตอร์เฟสที่ร่วมกันบนระบบคิวเช่น Resque, Delayed Job, Sidekiq, และอื่น ๆ

งานที่เขียนด้วย Active Job API ทำงานบนคิวที่รองรับได้ทั้งหมดด้วยตัวอัพเดตของตัวเอง Active Job มาพร้อมกับตัวรันอินไลน์ที่ทำงานงานทันที

งานบ่อยครั้งต้องการใช้วัตถุ Active Record เป็นอาร์กิวเมนต์ Active Job ส่งอ้างอิงวัตถุเป็น URI (uniform resource identifiers) แทนที่จะทำการมาร์ชล์วัตถุเอง ไลบรารีใหม่ Global ID สร้าง URI และค้นหาวัตถุที่อ้างถึง การส่งอาร์กิวเมนต์วัตถุ Active Record ใช้งานได้ง่ายโดยใช้ Global ID ภายใน

ตัวอย่างเช่น หาก trashable เป็นออบเจ็กต์ Active Record แล้วงานนี้ทำงานได้อย่างถูกต้องโดยไม่ต้องมีการซีรีส์ไลซ์:

class TrashableCleanupJob < ActiveJob::Base
  def perform(trashable, depth)
    trashable.cleanup(depth)
  end
end

ดูเอกสาร Active Job Basics สำหรับข้อมูลเพิ่มเติม

2.2 การส่งอีเมลแบบไม่เชื่อมต่อ

โดยอาศัย Active Job, Action Mailer มาพร้อมกับเมธอด deliver_later ที่ส่งอีเมลผ่านคิว ดังนั้นจึงไม่บล็อกคอนโทรลเลอร์หรือโมเดลหากคิวเป็นแบบไม่เชื่อมต่อ (คิวอินไลน์เริ่มต้นบล็อก) การส่งอีเมลได้ทันทียังคงเป็นไปได้ด้วย deliver_now.

2.3 Adequate Record

Adequate Record เป็นชุดการปรับปรุงประสิทธิภาพใน Active Record ที่ทำให้การเรียกใช้ find และ find_by ทั่วไปและการค้นหาข้อมูลที่เกี่ยวข้องบางประเภทเร็วขึ้นสูงสุดถึง 2 เท่า

มันทำงานโดยการเก็บคำสั่ง SQL ที่ใช้บ่อยเป็น prepared statements และนำมาใช้ซ้ำในการเรียกใช้ที่คล้ายกัน โดยข้ามการสร้างคำสั่ง query ในการเรียกใช้ครั้งถัดไปได้เป็นส่วนใหญ่ สำหรับรายละเอียดเพิ่มเติมโปรดอ่านบทความใน เว็บไซต์ของ Aaron Patterson.

Active Record จะใช้คุณสมบัตินี้โดยอัตโนมัติในการดำเนินการที่รองรับโดยไม่ต้องมีการเข้ามาเกี่ยวข้องหรือเปลี่ยนแปลงโค้ดของผู้ใช้ ตัวอย่างการดำเนินการที่รองรับคือ:

Post.find(1)  # การเรียกใช้ครั้งแรกจะสร้างและเก็บ prepared statement
Post.find(2)  # การเรียกใช้ครั้งถัดไปจะใช้ prepared statement ที่เก็บไว้

Post.find_by_title('first post')
Post.find_by_title('second post')

Post.find_by(title: 'first post')
Post.find_by(title: 'second post')

post.comments
post.comments(true)

สำคัญที่จะเน้นว่า ตามที่ตัวอย่างข้างต้นแนะนำ คำสั่ง prepared statements ไม่ได้เก็บค่าที่ถูกส่งผ่านในการเรียกใช้เมธอด แต่มีตัวยึดสำหรับค่าเหล่านั้น

การใช้งานแคชจะไม่ถูกใช้ในสถานการณ์ต่อไปนี้:

  • โมเดลมี default scope
  • โมเดลใช้ single table inheritance
  • find พร้อมกับรายการ id, เช่น:

    # ไม่ได้ถูกแคช
    Post.find(1, 2, 3)
    Post.find([1,2])
    
  • find_by พร้อมกับ SQL fragments:

    Post.find_by('published_at < ?', 2.weeks.ago)
    

2.4 Web Console

แอปพลิเคชันใหม่ที่สร้างด้วย Rails 4.2 มาพร้อมกับ Web Console gem โดยค่าเริ่มต้น Web Console เพิ่มคอนโซล Ruby แบบอินเทอร์แอคทีฟลงในทุกหน้าข้อผิดพลาดและให้ความช่วยเหลือด้วย console view และ controller helpers

คอนโซลแบบอินเทอร์แอคทีฟในหน้าข้อผิดพลาดช่วยให้คุณสามารถดำเนินการโค้ดในบริบทของสถานที่ที่เกิดข้อยกเว้น ฟังก์ชัน console ถ้าถูกเรียกใน view หรือ controller ใด ๆ จะเรียกใช้คอนโซลแบบอินเทอร์แอคทีฟที่มีบริบทสุดท้ายหลังจากการเรนเดอร์เสร็จสมบูรณ์

2.5 การสนับสนุน Foreign Key

Migration DSL ตอนนี้สนับสนุนการเพิ่มและลบ foreign key และถูกดัมป์ไปยัง schema.rb ในขณะนี้เฉพาะ adapter mysql, mysql2 และ postgresql รองรับ foreign key เท่านั้น ```ruby

เพิ่ม foreign key ไปยัง articles.author_id ที่อ้างอิง authors.id

add_foreign_key :articles, :authors

เพิ่ม foreign key ไปยัง articles.author_id ที่อ้างอิง users.lng_id

add_foreign_key :articles, :users, column: :author_id, primary_key: "lng_id"

ลบ foreign key ที่ accounts.branch_id

remove_foreign_key :accounts, :branches

ลบ foreign key ที่ accounts.owner_id

remove_foreign_key :accounts, column: :owner_id ```

ดูเอกสาร API ที่ add_foreign_key และ remove_foreign_key สำหรับคำอธิบายเพิ่มเติม

3 ความไม่เข้ากัน

ฟังก์ชันที่ถูกเลิกไว้ก่อนหน้านี้ถูกลบออกแล้ว โปรดอ้างอิงไปยังส่วนประกอบแต่ละส่วนสำหรับการเลิกใช้งานใหม่ในการอัปเกรดนี้

การเปลี่ยนแปลงต่อไปนี้อาจต้องการการดำเนินการทันทีหลังจากอัปเกรด

3.1 render ด้วยอาร์กิวเมนต์เป็นสตริง

ก่อนหน้านี้ การเรียกใช้ render "foo/bar" ในคอนโทรลเลอร์เป็นเทียบเท่ากับ render file: "foo/bar" ใน Rails 4.2 นี้ถูกเปลี่ยนเป็นหมายความว่า render template: "foo/bar" แทน หากคุณต้องการเรียกใช้ไฟล์โปรดเปลี่ยนรหัสของคุณให้ใช้รูปแบบชัดเจน (render file: "foo/bar") แทน

3.2 respond_with / Class-Level respond_to

respond_with และ class-level respond_to ที่เกี่ยวข้องถูกย้ายไปยัง gem responders เพิ่ม gem 'responders', '~> 2.0' ใน Gemfile เพื่อใช้:

# app/controllers/users_controller.rb

class UsersController < ApplicationController
  respond_to :html, :json

  def show
    @user = User.find(params[:id])
    respond_with @user
  end
end

Instance-level respond_to ไม่ได้รับผลกระทบ:

# app/controllers/users_controller.rb

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
    respond_to do |format|
      format.html
      format.json { render json: @user }
    end
  end
end

3.3 Default Host สำหรับ rails server

เนื่องจากการเปลี่ยนแปลงใน Rack (https://github.com/rack/rack/commit/28b014484a8ac0bbb388e7eaeeef159598ec64fc) rails server ตอนนี้จะฟังก์ชันบน localhost แทนที่จะฟังก์ชันบน 0.0.0.0 เริ่มต้น สิ่งนี้ควรมีผลกระทบน้อยต่อกระบวนการพัฒนามาตรฐานเนื่องจากทั้ง http://127.0.0.1:3000 และ http://localhost:3000 จะยังคงทำงานเหมือนเดิมบนเครื่องของคุณเอง

อย่างไรก็ตาม ด้วยการเปลี่ยนแปลงนี้คุณจะไม่สามารถเข้าถึงเซิร์ฟเวอร์ Rails จากเครื่องอื่นได้อีกต่อไป เช่น หากสภาพแวดล้อมการพัฒนาของคุณอยู่ในเครื่องจำลองเสมือนและคุณต้องการเข้าถึงจากเครื่องโฮสต์ ในกรณีเช่นนี้โปรดเริ่มเซิร์ฟเวอร์ด้วย rails server -b 0.0.0.0 เพื่อเรียกคืนพฤติกรรมเดิม หากคุณทำเช่นนี้ โปรดตั้งค่าไฟร์วอลล์ของคุณอย่างถูกต้องเพื่อให้เฉพาะเครื่องที่เชื่อถือได้บนเครือข่ายของคุณเท่านั้นที่สามารถเข้าถึงเซิร์ฟเวอร์การพัฒนาของคุณได้

3.4 สัญลักษณ์ตัวเลือกสถานะที่เปลี่ยนไปสำหรับ render

เนื่องจากมีการเปลี่ยนแปลงใน Rack (https://github.com/rack/rack/commit/be28c6a2ac152fe4adfbef71f3db9f4200df89e8) สัญลักษณ์ที่เมธอด render ยอมรับสำหรับตัวเลือก :status ได้เปลี่ยนไปดังนี้:

  • 306: :reserved ถูกลบออก
  • 413: :request_entity_too_large ถูกเปลี่ยนชื่อเป็น :payload_too_large
  • 414: :request_uri_too_long ถูกเปลี่ยนชื่อเป็น :uri_too_long
  • 416: :requested_range_not_satisfiable ถูกเปลี่ยนชื่อเป็น :range_not_satisfiable

โปรดจำไว้ว่าหากเรียกใช้ render ด้วยสัญลักษณ์ที่ไม่รู้จัก สถานะการตอบกลับจะเป็นค่าเริ่มต้นเป็น 500

3.5 HTML Sanitizer

HTML sanitizer ได้ถูกแทนที่ด้วยการสร้างขึ้นใหม่ที่แข็งแกร่งมากขึ้นโดยใช้ Loofah และ Nokogiri สามารถทำการฆ่าเชื้อโรคได้มากขึ้นและการทำความสะอาดของมันมีความแข็งแกร่งและยืดหยุ่นมากขึ้น

เนื่องจากอัลกอริทึมใหม่ ผลลัพธ์ที่ถูกทำความสะอาดอาจแตกต่างกันไปสำหรับข้อมูลที่ผิดปกติบางประการ

หากคุณต้องการผลลัพธ์ที่แน่นอนจากตัวทำความสะอาดเก่าคุณสามารถเพิ่ม gem rails-deprecated_sanitizer เข้าไปใน Gemfile เพื่อให้มีพฤติกรรมเก่า และ gem นี้จะไม่แสดงคำเตือนการเลิกใช้เพราะมันเป็นการเลือกใช้

rails-deprecated_sanitizer จะได้รับการสนับสนุนสำหรับ Rails 4.2 เท่านั้น และจะไม่ได้รับการบำรุงรักษาสำหรับ Rails 5.0

ดู บล็อกโพสต์นี้ เพื่อดูรายละเอียดเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงในตัวทำความสะอาดใหม่

3.6 assert_select

assert_select ตอนนี้ใช้เป็นพื้นฐานบน Nokogiri ดังนั้น บางตัวเลือกที่เป็นไปได้ก่อนหน้านี้จะไม่ได้รับการสนับสนุนอีกต่อไป หากแอปพลิเคชันของคุณใช้รูปแบบเหล่านี้คุณจะต้องอัปเดต:

  • ค่าในตัวเลือกแอตทริบิวต์อาจต้องใส่เครื่องหมายคำพูดหากมีอักขระที่ไม่ใช่ตัวอักษรและตัวเลข

    # ก่อนหน้านี้
    a[href=/]
    a[href$=/]
    
    # ตอนนี้
    a[href="/"]
    a[href$="/"]
    
  • DOMs ที่สร้างขึ้นจากแหล่งที่มาของ HTML ที่มี HTML ที่ไม่ถูกต้องที่มีองค์ประกอบที่ไม่ถูกต้องอาจแตกต่างกัน

    ตัวอย่างเช่น:

    # เนื้อหา: <div><i><p></i></div>
    
    # ก่อนหน้านี้:
    assert_select('div > i')  # => true
    assert_select('div > p')  # => false
    assert_select('i > p')    # => true
    
    # ตอนนี้:
    assert_select('div > i')  # => true
    assert_select('div > p')  # => true
    assert_select('i > p')    # => false
    
  • หากข้อมูลที่เลือกมี entity อยู่ ค่าที่เลือกสำหรับการเปรียบเทียบที่ใช้เคยเป็น raw (เช่น AT&amp;T) และตอนนี้ถูกประเมิน (เช่น AT&T)

    # content: <p>AT&amp;T</p>
    
    # ก่อน:
    assert_select('p', 'AT&amp;T')  # => true
    assert_select('p', 'AT&T')      # => false
    
    # ตอนนี้:
    assert_select('p', 'AT&T')      # => true
    assert_select('p', 'AT&amp;T')  # => false
    

นอกจากนี้การแทนที่ก็มีการเปลี่ยนไปใช้ไวยากรณ์ใหม่

ตอนนี้คุณต้องใช้ตัวเลือก :match ที่คล้ายกับ CSS selector:

assert_select ":match('id', ?)", 'comment_1'

นอกจากนี้การแทนที่ด้วย Regexp จะมีรูปแบบที่แตกต่างเมื่อการตรวจสอบล้มเหลว สังเกตว่า /hello/ ที่นี่:

assert_select(":match('id', ?)", /hello/)

กลายเป็น "(?-mix:hello)":

Expected at least 1 element matching "div:match('id', "(?-mix:hello)")", found 0..
Expected 0 to be >= 1.

ดูเอกสาร Rails Dom Testing เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับ assert_select

4 Railties

โปรดอ้างอิง [Changelog][railties] สำหรับการเปลี่ยนแปลงที่ละเอียด

4.1 การลบ

  • ตัวเลือก --skip-action-view ถูกลบออกจาก app generator (Pull Request)

  • คำสั่ง rails application ถูกลบออกโดยไม่มีการแทนที่ (Pull Request)

4.2 การเลิกใช้

  • เลิกใช้ config.log_level ที่ขาดหายไปสำหรับ production environments (Pull Request)

  • เลิกใช้ rake test:all และใช้ rake test แทนเนื่องจากตอนนี้รันทดสอบทั้งหมดในโฟลเดอร์ test (Pull Request)

  • เลิกใช้ rake test:all:db และใช้ rake test:db แทน (Pull Request)

  • เลิกใช้ Rails::Rack::LogTailer โดยไม่มีการแทนที่ (Commit)

4.3 การเปลี่ยนแปลงที่สำคัญ

  • เพิ่ม web-console ใน Gemfile ของแอปพลิเคชันเริ่มต้น (Pull Request)

  • เพิ่มตัวเลือก required ใน generator ของโมเดลสำหรับการสร้างความสัมพันธ์ (Pull Request)

  • เพิ่มเนมสเปซ x สำหรับการกำหนดตัวเลือกการกำหนดค่าที่กำหนดเอง:

    # config/environments/production.rb
    config.x.payment_processing.schedule = :daily
    config.x.payment_processing.retries  = 3
    config.x.super_debugger              = true
    

    ตัวเลือกเหล่านี้จะสามารถใช้ได้ผ่านอ็อบเจกต์การกำหนดค่า:

    Rails.configuration.x.payment_processing.schedule # => :daily
    Rails.configuration.x.payment_processing.retries  # => 3
    Rails.configuration.x.super_debugger              # => true
    

    (Commit)

  • เพิ่ม Rails::Application.config_for เพื่อโหลดการกำหนดค่าสำหรับ environment ปัจจุบัน

    # config/exception_notification.yml
    production:
      url: http://127.0.0.1:8080
      namespace: my_app_production
    development:
      url: http://localhost:3001
      namespace: my_app_development
    
    # config/environments/production.rb
    Rails.application.configure do
    config.middleware.use ExceptionNotifier, config_for(:exception_notification)
    end
    

(Pull Request)

  • ในเครื่องมือสร้างแอปเพิ่ม --skip-turbolinks option เพื่อไม่สร้างการผสานรวมกับ turbolinks (Commit)

  • ในการสร้างแอปเพิ่ม bin/setup script เป็นสคริปต์ที่ใช้งานอัตโนมัติเมื่อติดตั้งแอปพลิเคชัน (Pull Request)

  • เปลี่ยนค่าเริ่มต้นของ config.assets.digest เป็น true ในโหมดการพัฒนา (Pull Request)

  • เพิ่ม API เพื่อลงทะเบียนส่วนขยายใหม่สำหรับ rake notes (Pull Request)

  • เพิ่ม after_bundle callback เพื่อใช้ในเทมเพลตของ Rails (Pull Request)

  • เพิ่ม Rails.gem_version เป็นเมธอดที่สะดวกในการส่งคืน Gem::Version.new(Rails.version) (Pull Request)

5 Action Pack

โปรดอ้างอิงที่ [Changelog][action-pack] เพื่อดูการเปลี่ยนแปลงอย่างละเอียด

5.1 การลบ

  • respond_with และ respond_to ที่ระดับคลาสถูกลบออกจาก Rails และย้ายไปยัง gem responders (เวอร์ชัน 2.0) เพิ่ม gem 'responders', '~> 2.0' เข้าไปใน Gemfile เพื่อใช้งานคุณสมบัติเหล่านี้ต่อไป (Pull Request, รายละเอียดเพิ่มเติม)

  • ลบ AbstractController::Helpers::ClassMethods::MissingHelperError ที่ถูกยกเลิกแล้วและใช้ AbstractController::Helpers::MissingHelperError แทน (Commit)

5.2 การเลิกใช้

  • เลิกใช้ตัวเลือก only_path ในช่วยเหลือ *_path helpers (Commit)

  • เลิกใช้ assert_tag, assert_no_tag, find_tag และ find_all_tag และใช้ assert_select แทน (Commit)

  • เลิกใช้การตั้งค่า :to ของเราเตอร์เป็นสัญลักษณ์หรือสตริงที่ไม่มีอักขระ "#" : ruby get '/posts', to: MyRackApp => (ไม่ต้องเปลี่ยนอะไร) get '/posts', to: 'post#index' => (ไม่ต้องเปลี่ยนอะไร) get '/posts', to: 'posts' => get '/posts', controller: :posts get '/posts', to: :index => get '/posts', action: :index (Commit)

  • เลิกใช้คีย์สตริงใน URL helpers: ```ruby

    ไม่ดี

    root_path('controller' => 'posts', 'action' => 'index')

ดี

root_path(controller: 'posts', action: 'index') ``` (Pull Request)

5.3 การเปลี่ยนแปลงที่สำคัญ

  • ลบครอบคลุมของเมธอด *_filter ออกจากเอกสาร และแนะนำให้ใช้เมธอด *_action แทน: after_filter => after_action append_after_filter => append_after_action append_around_filter => append_around_action append_before_filter => append_before_action around_filter => around_action before_filter => before_action prepend_after_filter => prepend_after_action prepend_around_filter => prepend_around_action prepend_before_filter => prepend_before_action skip_after_filter => skip_after_action skip_around_filter => skip_around_action skip_before_filter => skip_before_action skip_filter => skip_action_callback หากแอปพลิเคชันของคุณขึ้นอยู่กับเมธอดเหล่านี้ให้ใช้เมธอด *_action แทน โดยเมธอดเหล่านี้จะถูกยกเลิกในอนาคตและในที่สุดจะถูกลบออกจาก Rails

  • render nothing: true หรือการเรนเดอร์ body nil จะไม่เพิ่มช่องว่างหนึ่งตัวใน body ของการตอบสนองอีกต่อไป

  • Rails ตอนนี้รวม digest ของเทมเพลตใน ETags โดยอัตโนมัติ

  • ส่วนที่ถูกส่งผ่านไปยัง URL helpers จะถูกหนีไว้โดยอัตโนมัติ

  • มีตัวเลือก always_permitted_parameters เพื่อกำหนดค่าพารามิเตอร์ที่อนุญาตทั้งหมดในระดับทั่วโลก ค่าเริ่มต้นของการกำหนดค่านี้คือ ['controller', 'action']

  • เพิ่ม HTTP method MKCALENDAR จาก RFC 4791

  • การแจ้งเตือน *_fragment.action_controller ตอนนี้รวมชื่อคอนโทรลเลอร์และชื่อแอ็กชันใน payload

  • ปรับปรุงหน้าข้อผิดพลาดของเร้าท์ด้วยการจับคู่ที่ไม่แน่นอนสำหรับการค้นหาเส้นทาง

  • เพิ่มตัวเลือกในการปิดการบันทึกข้อผิดพลาดของ CSRF

  • เมื่อเซิร์ฟเวอร์ Rails ถูกตั้งค่าให้ให้บริการค่าสถานะแบบสถิตให้บริการไฟล์ gzip ถ้าไคลเอ็นต์รองรับและมีไฟล์ gzip ที่ถูกสร้างล่วงหน้า (.gz) อยู่บนดิสก์ โดยค่าเริ่มต้นของ asset pipeline คือการสร้างไฟล์ .gz สำหรับทรัพยากรที่สามารถบีบอัดได้ การให้บริการไฟล์ gzip จะลดการถ่ายโอนข้อมูลและเพิ่มความเร็วในการร้องขอทรัพยากร ในการให้บริการทรัพยากรจากเซิร์ฟเวอร์ Rails ในโหมดการใช้งานจริง ให้ ใช้ CDN เสมอ

  • เมื่อเรียกใช้เมธอด process ในการทดสอบการรวมกัน ต้องมีเครื่องหมายทางเส้นทางด้านหน้า ก่อนหน้านี้คุณสามารถละเว้นได้ แต่นั่นเป็นผลลัพธ์ของการดำเนินการและไม่ใช่คุณสมบัติที่ตั้งใจ เช่น:

test "list all posts" do
  get "/posts"
  assert_response :success
end

6 Action View

โปรดอ้างอิงที่ [Changelog][action-view] สำหรับการเปลี่ยนแปลงที่ละเอียดอ่อน * ยกเลิกการใช้ ActionView::Digestor#digest(name, format, finder, options = {}) และแนะนำให้ใช้อาร์กิวเมนต์ในรูปแบบของแฮชแทน (Pull Request)

6.1 การเปลี่ยนแปลงที่สำคัญ

  • render "foo/bar" ตอนนี้จะขยายเป็น render template: "foo/bar" แทนที่จะเป็น render file: "foo/bar" (Pull Request)

  • ช่วยเหลือในการสร้างฟอร์มไม่ได้สร้างอิลิเมนต์ <div> พร้อมกับ CSS ภายใน (Pull Request)

  • เพิ่มตัวแปรพิเศษ #{partial_name}_iteration สำหรับใช้กับพาร์ทเชียลที่ถูกเรียกด้วยคอลเลกชัน มันจะให้การเข้าถึงสถานะปัจจุบันของการเรียกด้วยตัวชี้วัดผ่านเมธอด index, size, first? และ last? (Pull Request)

  • Placeholder I18n ตามหลักการเดียวกับ label I18n (Pull Request)

7 Action Mailer

โปรดอ้างอิงที่ [Changelog][action-mailer] สำหรับรายละเอียดการเปลี่ยนแปลง

7.1 การเลิกใช้

  • ยกเลิกใช้เฮลเปอร์ *_path ในเมลเลอร์ และแนะนำให้ใช้เฮลเปอร์ *_url แทน (Pull Request)

  • ยกเลิกใช้ deliver / deliver! และแนะนำให้ใช้ deliver_now / deliver_now! แทน (Pull Request)

7.2 การเปลี่ยนแปลงที่สำคัญ

  • link_to และ url_for สร้าง URL แบบสมบูรณ์โดยค่าเริ่มต้นในเทมเพลต ไม่จำเป็นต้องส่ง only_path: false อีกต่อไป (Commit)

  • เพิ่ม deliver_later ซึ่งจะเพิ่มงานในคิวของแอปพลิเคชันเพื่อส่งอีเมลแบบไม่เดียวกัน (Pull Request)

  • เพิ่มตัวเลือกการกำหนดค่า show_previews เพื่อเปิดใช้งานการแสดงตัวอย่างเมลเลอร์นอกจากสภาวะการพัฒนา (Pull Request)

8 Active Record

โปรดอ้างอิงที่ [Changelog][active-record] สำหรับรายละเอียดการเปลี่ยนแปลง

8.1 การลบ

  • ลบ cache_attributes และคำสั่งที่เกี่ยวข้อง ทุกแอตทริบิวต์จะถูกแคช (Pull Request)

  • ลบเมธอดที่ถูกยกเลิก ActiveRecord::Base.quoted_locking_column (Pull Request)

  • ลบเมธอดที่ถูกยกเลิก ActiveRecord::Migrator.proper_table_name ใช้เมธอดตัวอย่าง proper_table_name ในอินสแตนซ์ของ ActiveRecord::Migration แทน (Pull Request)

  • ลบประเภท :timestamp ที่ไม่ได้ใช้ แทนที่จะใช้ :datetime ในทุกกรณี แก้ไขความไม่สอดคล้องเมื่อประเภทคอลัมน์ถูกส่งออกนอก Active Record เช่นสำหรับการซีเรียลไซเซชัน XML (Pull Request)

8.2 การเลิกใช้

  • ยกเลิกการซ่อนข้อผิดพลาดภายใน after_commit และ after_rollback (Pull Request)

  • ยกเลิกการสนับสนุนการตรวจหาค่านับโดยอัตโนมัติบนการสัมพันธ์ has_many :through ที่เสียหาย คุณควรระบุค่านับโดยตรงในการสัมพันธ์ has_many และ belongs_to สำหรับบันทึกผ่าน (Pull Request)

  • ยกเลิกการส่งออบเจ็กต์ Active Record ไปยัง .find หรือ .exists? ให้เรียก id บนออบเจ็กต์ก่อน (คอมมิต 1, 2)

  • ยกเลิกการสนับสนุนรูปแบบค่าเริ่มต้นสำหรับ PostgreSQL range ที่ไม่สมบูรณ์ที่มีการยกเว้นจุดเริ่มต้น ณ ปัจจุบันเราแมประเภท range ของ PostgreSQL เป็นระยะเวลาของ Ruby การแปลงนี้ไม่เป็นไปตามที่สมบูรณ์เพราะระยะเวลาของ Ruby ไม่สนับสนุนการยกเว้นจุดเริ่มต้น

    วิธีการปัจจุบันของการเพิ่มค่าเริ่มต้นไม่ถูกต้องและถูกยกเลิกแล้ว สำหรับ subtype ที่เราไม่รู้วิธีการเพิ่มค่า (เช่น succ ไม่ได้ถูกกำหนด) จะเกิดข้อผิดพลาดของ ArgumentError สำหรับระยะเวลาที่มีการยกเว้นจุดเริ่มต้น (คอมมิต 1)

  • ยกเลิกการเรียกใช้ DatabaseTasks.load_schema โดยไม่มีการเชื่อมต่อ ให้ใช้ DatabaseTasks.load_schema_current แทน (คอมมิต 1)

  • ยกเลิก sanitize_sql_hash_for_conditions โดยไม่มีการแทนที่ การใช้ Relation สำหรับการดำเนินการค้นหาและอัปเดตเป็น API ที่แนะนำ (คอมมิต 1)

  • ยกเลิก add_timestamps และ t.timestamps โดยไม่ส่ง :null option ค่าเริ่มต้นของ null: true จะเปลี่ยนใน Rails 5 เป็น null: false (พูลรีเควส 1)

  • ยกเลิก Reflection#source_macro โดยไม่มีการแทนที่เนื่องจากไม่จำเป็นต้องใช้ใน Active Record อีกต่อไป (พูลรีเควส 1)

  • ยกเลิก serialized_attributes โดยไม่มีการแทนที่ (พูลรีเควส 1)

  • ยกเลิกการส่งค่า nil จาก column_for_attribute เมื่อไม่มีคอลัมน์อยู่ ใน Rails 5.0 จะส่งกลับวัตถุ null (พูลรีเควส 1)

  • ยกเลิกการใช้ .joins, .preload และ .eager_load กับการเชื่อมโยงที่ขึ้นอยู่กับสถานะของอินสแตนซ์ (เช่น นั่นที่ถูกกำหนดด้วย scope ที่รับอาร์กิวเมนต์) โดยไม่มีการแทนที่ (คอมมิต 1)

8.3 การเปลี่ยนแปลงที่สำคัญ

  • SchemaDumper ใช้ force: :cascade ใน create_table นี้ทำให้เป็นไปได้ที่จะโหลดสกีม่าเมื่อมีคีย์ต่างประเทศอยู่

  • เพิ่ม :required option ในการเชื่อมโยงแบบเดี่ยว ซึ่งกำหนดการตรวจสอบความมีอยู่ในการเชื่อมโยง (พูลรีเควส 1)

  • ActiveRecord::Dirty ตอนนี้สามารถตรวจจับการเปลี่ยนแปลงในที่เดียวกันกับค่าที่เปลี่ยนแปลงได้ แอตทริบิวต์ที่ถูกซีเรียลไว้บนโมเดล Active Record จะไม่ถูกบันทึกเมื่อไม่เปลี่ยนแปลง สิ่งนี้ยังสามารถทำงานได้กับประเภทอื่น เช่น คอลัมน์สตริงและคอลัมน์ json บน PostgreSQL (พูลรีเควส 1, 2, 3)

  • เพิ่มงาน Rake db:purge เพื่อล้างฐานข้อมูลสำหรับสภาพแวดล้อมปัจจุบัน (คอมมิต 1)

  • นำเสนอ ActiveRecord::Base#validate! ซึ่งเรียกใช้ ActiveRecord::RecordInvalid หากเกิดข้อผิดพลาดในการตรวจสอบข้อมูล (Pull Request)

  • นำเสนอ validate เป็นตัวย่อสำหรับ valid? (Pull Request)

  • touch สามารถรับค่า attribute ได้หลายค่าพร้อมกัน (Pull Request)

  • อแดปเตอร์ PostgreSQL สนับสนุนชนิดข้อมูล jsonb ใน PostgreSQL 9.4+ (Pull Request)

  • อแดปเตอร์ PostgreSQL และ SQLite ไม่เพิ่มค่า default limit 255 ตัวอักษรในคอลัมน์ชนิด string อีกต่อไป (Pull Request)

  • เพิ่มการสนับสนุนชนิดคอลัมน์ citext ในอแดปเตอร์ PostgreSQL (Pull Request)

  • เพิ่มการสนับสนุนชนิด range types ที่สร้างโดยผู้ใช้ในอแดปเตอร์ PostgreSQL (Commit)

  • sqlite3:///some/path ตอนนี้จะแปลงเป็นเส้นทางระบบแบบสมบูรณ์ /some/path สำหรับเส้นทางที่เป็นเส้นทางสัมพันธ์ให้ใช้ sqlite3:some/path แทน (ก่อนหน้านี้ sqlite3:///some/path แปลงเป็นเส้นทางสัมพันธ์ some/path ซึ่งเป็นการใช้งานที่ถูกยกเลิกใน Rails 4.1) (Pull Request)

  • เพิ่มการสนับสนุนวินาทีเศษสำหรับ MySQL 5.6 และสูงกว่า (Pull Request 1, 2)

  • เพิ่ม ActiveRecord::Base#pretty_print เพื่อพิมพ์แบบสวยงามสำหรับโมเดล (Pull Request)

  • ActiveRecord::Base#reload ตอนนี้มีพฤติกรรมเดียวกับ m = Model.find(m.id) ซึ่งหมายความว่าจะไม่เก็บค่า attributes เพิ่มเติมจาก SELECT ที่กำหนดเอง (Pull Request)

  • ActiveRecord::Base#reflections ตอนนี้คืนค่าเป็นแฮชที่มีคีย์เป็นสตริงแทนที่จะเป็นสัญลักษณ์ (Pull Request)

  • เมธอด references ในการทำฐานข้อมูลสนับสนุนตัวเลือก type เพื่อระบุชนิดของคีย์ต่างประเทศ (เช่น :uuid) (Pull Request)

9 Active Model

โปรดอ้างอิงที่ [Changelog][active-model] สำหรับการเปลี่ยนแปลงที่ละเอียด

9.1 การลบ

  • ลบ Validator#setup ที่ถูกยกเลิกโดยไม่มีตัวแทน (Pull Request)

9.2 การเลิกใช้

  • เลิกใช้ reset_#{attribute} และใช้ restore_#{attribute} แทน (Pull Request)

  • เลิกใช้ ActiveModel::Dirty#reset_changes และใช้ clear_changes_information แทน (Pull Request)

9.3 การเปลี่ยนแปลงที่สำคัญ

  • นำเสนอ validate เป็นตัวย่อสำหรับ valid? (Pull Request)

  • นำเสนอเมธอด restore_attributes ใน ActiveModel::Dirty เพื่อกู้คืนค่า attribute ที่เปลี่ยนแปลง (dirty) กลับเป็นค่าก่อนหน้า (Pull Request 1, 2)

  • has_secure_password ไม่ได้ห้ามรหัสผ่านที่ว่างเปล่า (เช่น รหัสผ่านที่มีเฉพาะช่องว่าง) โดยค่าเริ่มต้นอีกต่อไป (Pull Request)

  • has_secure_password ตอนนี้ตรวจสอบว่ารหัสผ่านที่ให้มามีความยาวไม่เกิน 72 ตัวอักษรเมื่อการตรวจสอบถูกเปิดใช้งานแล้ว (Pull Request)

10 Active Support

โปรดอ้างอิง Changelog สำหรับรายละเอียดการเปลี่ยนแปลงที่ละเอียด

10.1 การลบ

  • ลบ Numeric#ago, Numeric#until, Numeric#since, Numeric#from_now ที่ถูกยกเลิกไปแล้ว (Commit)

  • ลบ string based terminators ที่ถูกยกเลิกไปแล้วสำหรับ ActiveSupport::Callbacks (Pull Request)

10.2 การเลิกใช้งาน

  • เลิกใช้งาน Kernel#silence_stderr, Kernel#capture และ Kernel#quietly โดยไม่มีการแทนที่ (Pull Request)

  • เลิกใช้งาน Class#superclass_delegating_accessor ใช้ Class#class_attribute แทน (Pull Request)

  • เลิกใช้งาน ActiveSupport::SafeBuffer#prepend! เนื่องจาก ActiveSupport::SafeBuffer#prepend ทำหน้าที่เดียวกันแล้ว (Pull Request)

10.3 การเปลี่ยนแปลงที่สำคัญ

  • เพิ่มตัวเลือกการกำหนดค่าใหม่ active_support.test_order เพื่อระบุลำดับที่ทดสอบจะถูกดำเนินการ ตัวเลือกนี้เริ่มต้นด้วย :sorted แต่จะเปลี่ยนเป็น :random ใน Rails 5.0 (Commit)

  • Object#try และ Object#try! สามารถใช้ได้โดยไม่ต้องระบุผู้รับโดยชัดเจนในบล็อก (Commit, Pull Request)

  • เครื่องมือทดสอบ travel_to ตอนนี้จะตัดส่วน usec ให้เป็น 0 (Commit)

  • เพิ่ม Object#itself เป็นฟังก์ชัน identity (Commit 1, 2)

  • Object#with_options สามารถใช้ได้โดยไม่ต้องระบุผู้รับโดยชัดเจนในบล็อก (Pull Request)

  • เพิ่ม String#truncate_words เพื่อตัดคำในสตริงตามจำนวนคำที่กำหนด (Pull Request)

  • เพิ่ม Hash#transform_values และ Hash#transform_values! เพื่อทำให้ง่ายขึ้นในกรณีที่ต้องเปลี่ยนค่าของคีย์ในแฮช แต่คีย์ยังคงเดิม (Pull Request)

  • เครื่องมือ inflector humanize ตอนนี้จะลบขีดล่างด้านหน้าทิ้งทั้งหมด (Commit)

  • เพิ่ม Concern#class_methods เป็นทางเลือกในการใช้งานแทน module ClassMethods และ Kernel#concern เพื่อลดการเขียนโค้ด boilerplate module Foo; extend ActiveSupport::Concern; end (Commit)

  • คู่มือใหม่ เกี่ยวกับการโหลดและโหลดค่าคงที่

11 เครดิต

ดูรายชื่อเต็มของผู้มีส่วนร่วมใน Rails ได้ที่ รายชื่อผู้มีส่วนร่วมทั้งหมดใน Rails สำหรับ ผู้ที่ใช้เวลาหลายชั่วโมงในการทำให้ Rails เป็นเฟรมเวิร์กที่เสถียรและแข็งแกร่งในปัจจุบัน ยินดีด้วยทุกคน

ข้อเสนอแนะ

คุณสามารถช่วยปรับปรุงคุณภาพของคู่มือนี้ได้

กรุณาช่วยเพิ่มเติมหากพบข้อผิดพลาดหรือข้อผิดพลาดทางความจริง เพื่อเริ่มต้นคุณสามารถอ่านส่วน การสนับสนุนเอกสาร ของเราได้

คุณอาจพบเนื้อหาที่ไม่สมบูรณ์หรือเนื้อหาที่ไม่ได้อัปเดต กรุณาเพิ่มเอกสารที่ขาดหายไปสำหรับเนื้อหาหลัก โปรดตรวจสอบ Edge Guides ก่อนเพื่อตรวจสอบ ว่าปัญหาได้รับการแก้ไขหรือไม่ในสาขาหลัก ตรวจสอบ คู่มือแนวทาง Ruby on Rails เพื่อดูรูปแบบและกฎเกณฑ์

หากคุณพบข้อผิดพลาดแต่ไม่สามารถแก้ไขได้เอง กรุณา เปิดปัญหา.

และสุดท้าย การสนทนาใด ๆ เกี่ยวกับ Ruby on Rails เอกสารยินดีต้อนรับที่สุดใน เว็บบอร์ดอย่างเป็นทางการของ Ruby on Rails.