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&T
) และตอนนี้ถูกประเมิน (เช่นAT&T
)# content: <p>AT&T</p> # ก่อน: assert_select('p', 'AT&T') # => true assert_select('p', 'AT&T') # => false # ตอนนี้: assert_select('p', 'AT&T') # => true assert_select('p', 'AT&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
ในเครื่องมือสร้างแอปเพิ่ม
--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 และย้ายไปยัง gemresponders
(เวอร์ชัน 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
แทน โดยเมธอดเหล่านี้จะถูกยกเลิกในอนาคตและในที่สุดจะถูกลบออกจาก Railsrender nothing: true
หรือการเรนเดอร์ bodynil
จะไม่เพิ่มช่องว่างหนึ่งตัวใน 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#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
เพื่อลดการเขียนโค้ด boilerplatemodule Foo; extend ActiveSupport::Concern; end
(Commit)คู่มือใหม่ เกี่ยวกับการโหลดและโหลดค่าคงที่
11 เครดิต
ดูรายชื่อเต็มของผู้มีส่วนร่วมใน Rails ได้ที่ รายชื่อผู้มีส่วนร่วมทั้งหมดใน Rails สำหรับ ผู้ที่ใช้เวลาหลายชั่วโมงในการทำให้ Rails เป็นเฟรมเวิร์กที่เสถียรและแข็งแกร่งในปัจจุบัน ยินดีด้วยทุกคน
ข้อเสนอแนะ
คุณสามารถช่วยปรับปรุงคุณภาพของคู่มือนี้ได้
กรุณาช่วยเพิ่มเติมหากพบข้อผิดพลาดหรือข้อผิดพลาดทางความจริง เพื่อเริ่มต้นคุณสามารถอ่านส่วน การสนับสนุนเอกสาร ของเราได้
คุณอาจพบเนื้อหาที่ไม่สมบูรณ์หรือเนื้อหาที่ไม่ได้อัปเดต กรุณาเพิ่มเอกสารที่ขาดหายไปสำหรับเนื้อหาหลัก โปรดตรวจสอบ Edge Guides ก่อนเพื่อตรวจสอบ ว่าปัญหาได้รับการแก้ไขหรือไม่ในสาขาหลัก ตรวจสอบ คู่มือแนวทาง Ruby on Rails เพื่อดูรูปแบบและกฎเกณฑ์
หากคุณพบข้อผิดพลาดแต่ไม่สามารถแก้ไขได้เอง กรุณา เปิดปัญหา.
และสุดท้าย การสนทนาใด ๆ เกี่ยวกับ Ruby on Rails เอกสารยินดีต้อนรับที่สุดใน เว็บบอร์ดอย่างเป็นทางการของ Ruby on Rails.