1 การอัปเกรดไปยัง Rails 5.0
หากคุณกำลังอัปเกรดแอปพลิเคชันที่มีอยู่อยู่ ควรมีการทดสอบที่ดีก่อนที่จะเริ่มต้น คุณควรอัปเกรดเป็น Rails 4.2 ก่อนหากคุณยังไม่ได้ทำ และตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณยังทำงานตามที่คาดหวังก่อนที่จะพยายามอัปเดตเป็น Rails 5.0 มีรายการสิ่งที่ควรระวังเมื่ออัปเกรดในเอกสาร การอัปเกรด Ruby on Rails.
2 คุณสมบัติหลัก
2.1 Action Cable
Action Cable เป็นเฟรมเวิร์กใหม่ใน Rails 5.0 มันรวม WebSockets ได้อย่างราบรื่นกับแอปพลิเคชัน Rails ของคุณ
Action Cable ช่วยให้คุณสามารถเขียนคุณสมบัติแบบเรียลไทม์ในภาษา Ruby ในรูปแบบและรูปแบบเดียวกับส่วนอื่น ๆ ของแอปพลิเคชัน Rails ของคุณ ในขณะเดียวกันยังมีประสิทธิภาพและมีความสามารถในการขยายขนาด มันเป็นเฟรมเวิร์กแบบ full-stack ที่ให้บริการทั้งเฟรมเวิร์กฝั่งไคลเอนต์และเฟรมเวิร์กฝั่งเซิร์ฟเวอร์ในภาษา Ruby คุณสามารถเข้าถึงโมเดลโดเมนทั้งหมดของคุณที่เขียนด้วย Active Record หรือ ORM ที่คุณเลือก
ดูเอกสาร Action Cable Overview สำหรับข้อมูลเพิ่มเติม
2.2 แอปพลิเคชัน API
Rails สามารถใช้สร้างแอปพลิเคชัน API ที่มีขนาดเล็กลงได้แล้ว สิ่งนี้เป็นประโยชน์ในการสร้างและให้บริการ API ที่คล้ายกับ Twitter หรือ GitHub API ซึ่งสามารถใช้ในการให้บริการสู่สาธารณะและสำหรับแอปพลิเคชันที่กำหนดเองได้
คุณสามารถสร้างแอป Rails แบบ api ใหม่โดยใช้คำสั่ง:
$ rails new my_api --api
สิ่งที่จะทำ:
- กำหนดค่าให้แอปพลิเคชันเริ่มต้นด้วยเซ็ตของมิดเดิลแวร์ที่จำกัดมากกว่าปกติ โดยเฉพาะอย่างยิ่งจะไม่รวมมิดเดิลแวร์ที่มีประโยชน์สำหรับแอปพลิเคชันเบราว์เซอร์ (เช่นการสนับสนุนคุกกี้) โดยค่าเริ่มต้น
- ทำให้
ApplicationController
สืบทอดจากActionController::API
แทนที่จะสืบทอดจากActionController::Base
เช่นเดียวกับมิดเดิลแวร์ นี้จะไม่รวมโมดูล Action Controller ที่ให้ฟังก์ชันที่ใช้งานโดยเฉพาะสำหรับแอปพลิเคชันเบราว์เซอร์ - กำหนดค่าเจเนอเรเตอร์ให้ข้ามการสร้างวิว เฮลเปอร์ และแอสเซ็ตเมื่อคุณสร้างทรัพยากรใหม่
แอปพลิเคชันจะให้ฐานสำหรับ API ซึ่งจากนั้นสามารถ กำหนดค่าให้ดึงฟังก์ชัน เมื่อเหมาะสมสำหรับความต้องการของแอปพลิเคชัน
ดูเพิ่มเติมในเอกสาร การใช้ Rails สำหรับแอปพลิเคชัน API เท่านั้น
2.3 Active Record attributes API
กำหนดค่าแอตทริบิวต์ที่มีประเภทบนโมเดล จะแทนที่ประเภทของแอตทริบิวต์ที่มีอยู่ถ้าจำเป็น
สิ่งนี้ช่วยควบคุมวิธีการแปลงค่าเป็นและจาก SQL เมื่อกำหนดให้กับโมเดล
นอกจากนี้ยังเปลี่ยนพฤติกรรมของค่าที่ส่งผ่านไปยัง ActiveRecord::Base.where
ซึ่งให้เราใช้วัตถุโดเมนของเราได้ในหลายส่วนของ Active Record โดยไม่ต้องพึ่งพารายละเอียดการดำเนินการหรือการแก้ไขโค้ด
บางสิ่งที่คุณสามารถทำได้ด้วยสิ่งนี้:
- สามารถแทนที่ประเภทที่ Active Record ตรวจพบได้
- สามารถกำหนดค่าเริ่มต้นได้เช่นกัน
- แอตทริบิวต์ไม่จำเป็นต้องมีคอลัมน์ในฐานข้อมูล
# db/schema.rb
create_table :store_listings, force: true do |t|
t.decimal :price_in_cents
t.string :my_string, default: "original default"
end
# app/models/store_listing.rb
class StoreListing < ActiveRecord::Base
end
store_listing = StoreListing.new(price_in_cents: '10.1')
# ก่อน
store_listing.price_in_cents # => BigDecimal.new(10.1)
StoreListing.new.my_string # => "original default"
class StoreListing < ActiveRecord::Base
attribute :price_in_cents, :integer # ประเภทที่กำหนดเอง
attribute :my_string, :string, default: "new default" # ค่าเริ่มต้น
attribute :my_default_proc, :datetime, default: -> { Time.now } # ค่าเริ่มต้น
attribute :field_without_db_column, :integer, array: true
end
# หลัง
store_listing.price_in_cents # => 10
StoreListing.new.my_string # => "new default"
StoreListing.new.my_default_proc # => 2015-05-30 11:04:48 -0600
model = StoreListing.new(field_without_db_column: ["1", "2", "3"])
model.attributes # => {field_without_db_column: [1, 2, 3]}
สร้างประเภทที่กำหนดเอง:
คุณสามารถกำหนดประเภทที่กำหนดเองได้ตามที่คุณต้องการ โดยให้ตอบสนองกับเมธอดที่กำหนดไว้ในประเภทของค่า มีการเรียกใช้เมธอด deserialize
หรือ cast
บนออบเจ็กต์ประเภทของคุณ ด้วยข้อมูลเข้ารหัสจากฐานข้อมูลหรือจากคอนโทรลเลอร์ของคุณ นี่เป็นประโยชน์ เช่น เมื่อทำการแปลงแบบกำหนดเอง เช่น ข้อมูลเงิน
การค้นหา:
เมื่อเรียกใช้ ActiveRecord::Base.where
จะใช้ประเภทที่กำหนดโดยคลาสโมเดลในการแปลงค่าเป็น SQL โดยเรียกใช้ serialize
บนออบเจ็กต์ประเภทของคุณ
สิ่งนี้ช่วยให้วัตถุสามารถระบุวิธีการแปลงค่าเมื่อทำการค้นหา SQL
การตรวจสอบการเปลี่ยนแปลง:
ประเภทของแอตทริบิวต์สามารถเปลี่ยนวิธีการตรวจสอบการติดตามการเปลี่ยนแปลงได้
ดู เอกสาร สำหรับรายละเอียดเพิ่มเติม
2.4 เครื่องมือทดสอบ
เครื่องมือทดสอบใหม่ถูกนำเสนอเพื่อเพิ่มความสามารถในการเรียกใช้งานทดสอบจาก Rails
ในการใช้เครื่องมือทดสอบนี้เพียงพิมพ์ bin/rails test
.
เครื่องมือทดสอบนี้ได้รับแรงบันดาลใจมาจาก RSpec
, minitest-reporters
, maxitest
และอื่น ๆ
มีการพัฒนาขึ้นมาดังนี้:
- รันเทสเดียวโดยใช้หมายเลขบรรทัดของเทส
- รันเทสหลายๆ เทสโดยระบุหมายเลขบรรทัดของเทส
- ข้อความผิดพลาดที่ปรับปรุง ซึ่งยังช่วยให้รันเทสที่ล้มเหลวอีกครั้งได้ง่ายขึ้น
- ระบบหยุดการทดสอบทันทีเมื่อเกิดข้อผิดพลาด โดยใช้ตัวเลือก
-f
เพื่อหยุดการทดสอบทันทีเมื่อเกิดข้อผิดพลาด แทนที่จะรอให้ชุดทดสอบเสร็จสมบูรณ์ - เลื่อนการแสดงผลของการทดสอบไปยังท้ายของการรันทดสอบเต็ม โดยใช้ตัวเลือก
-d
- แสดงผลการแสดงข้อผิดพลาดทั้งหมด โดยใช้ตัวเลือก
-b
- การผสานร่วมกับ minitest เพื่ออนุญาตให้ใช้ตัวเลือกเช่น
-s
สำหรับข้อมูลเมล็ดพันธุ์ทดสอบ-n
เพื่อรันเทสที่ระบุชื่อ -v เพื่อแสดงผลการทดสอบอย่างละเอียดและอื่น ๆ - การแสดงผลการทดสอบที่มีสี
3 Railties
โปรดอ้างอิงที่ Changelog สำหรับการเปลี่ยนแปลงที่ละเอียด
3.1 การลบ
- ลบการสนับสนุนตัวแก้บัก ใช้ byebug แทน
debugger
ไม่รองรับโดย Ruby 2.2. (commit) ลบงาน
test:all
และtest:all:db
ที่ถูกยกเลิกไป (commit)ลบ
Rails::Rack::LogTailer
ที่ถูกยกเลิกไป (commit)ลบค่าคงที่
RAILS_CACHE
ที่ถูกยกเลิกไป (commit)ลบการกำหนดค่า
serve_static_assets
ที่ถูกยกเลิกไป (commit)ลบงานเอกสาร
doc:app
,doc:rails
, และdoc:guides
ที่ถูกยกเลิกไป (commit)ลบ
Rack::ContentLength
middleware ออกจาก stack ค่าเริ่มต้น (Commit)
3.2 การเลิกใช้งาน
เลิกใช้งาน
config.static_cache_control
และใช้config.public_file_server.headers
แทน (Pull Request)เลิกใช้งาน
config.serve_static_files
และใช้config.public_file_server.enabled
แทน (Pull Request)เลิกใช้งานงานในเนมสเปซ
rails
และใช้งานในเนมสเปซapp
แทน (เช่นrails:update
และrails:template
ถูกเปลี่ยนชื่อเป็นapp:update
และapp:template
) (Pull Request)
3.3 การเปลี่ยนแปลงที่สำคัญ
เพิ่ม Rails test runner
bin/rails test
(Pull Request)แอปพลิเคชันและปลั๊กอินที่สร้างใหม่จะได้รับ
README.md
ในรูปแบบ Markdown (commit, Pull Request)เพิ่มงาน
bin/rails restart
เพื่อรีสตาร์ทแอปพลิเคชัน Rails โดยสัมผัสtmp/restart.txt
(Pull Request)เพิ่มงาน
bin/rails initializers
เพื่อพิมพ์อินิเชียไลเซอร์ที่กำหนดไว้ทั้งหมดในลำดับที่ถูกเรียกใช้โดย Rails (Pull Request)เพิ่มงาน
bin/rails dev:cache
เพื่อเปิดหรือปิดใช้งานแคชในโหมดการพัฒนา (Pull Request)เพิ่มสคริปต์
bin/update
เพื่ออัปเดตสภาพแวดล้อมการพัฒนาโดยอัตโนมัติ (Pull Request)ส่ง Rake tasks ผ่าน
bin/rails
(Pull Request, Pull Request)แอปพลิเคชันใหม่ถูกสร้างขึ้นด้วยตัวตรวจสอบไฟล์ระบบที่ใช้เหตุการณ์เป็นตัวควบคุมบน Linux และ macOS คุณสามารถเลือกไม่ใช้คุณลักษณะนี้ได้โดยผ่าน
--skip-listen
ไปยังตัวสร้าง (commit, commit)สร้างแอปพลิเคชันพร้อมตัวเลือกในการเขียนบันทึกไปยัง STDOUT ในโหมดการใช้งานจริงโดยใช้ตัวแปรสภาพแวดล้อม
RAILS_LOG_TO_STDOUT
(Pull Request)เปิดใช้งาน HSTS พร้อมส่วนหัว IncludeSubdomains สำหรับแอปพลิเคชันใหม่ (Pull Request)
ตัวสร้างแอปพลิเคชันเขียนไฟล์ใหม่
config/spring.rb
ซึ่งบอก Spring ให้ดูไฟล์ทั่วไปเพิ่มเติม (commit)เพิ่มตัวเลือก
--skip-action-mailer
เพื่อข้าม Action Mailer เมื่อสร้างแอปพลิเคชันใหม่ (Pull Request)ลบไดเรกทอรี
tmp/sessions
และงาน rake ที่เกี่ยวข้อง (Pull Request)เปลี่ยน
_form.html.erb
ที่ถูกสร้างขึ้นโดยตัวสร้าง scaffold เพื่อใช้ตัวแปรท้องถิ่น (Pull Request)ปิดการโหลดคลาสอัตโนมัติในสภาพแวดล้อมการใช้งานจริง (commit)
4 Action Pack
โปรดอ้างอิงที่ Changelog สำหรับการเปลี่ยนแปลงที่ละเอียด
4.1 การลบ
ลบ
ActionDispatch::Request::Utils.deep_munge
(commit)ลบ
ActionController::HideActions
(Pull Request)ลบ
respond_to
และrespond_with
ฟังก์ชันตัวอย่างที่ถูกนำออกแล้ว ฟังก์ชันนี้ ถูกแยกออกเป็น responders gem (commit)ลบไฟล์การยืนยันที่ถูกเลิกใช้งาน (commit)
ลบการใช้งานที่ถูกเลิกใช้งานของคีย์สตริงใน URL helpers (commit)
ลบตัวเลือก
only_path
ที่ถูกเลิกใช้งานใน*_path
helpers (commit)ลบการสนับสนุนที่ถูกเลิกใช้งานของ
NamedRouteCollection#helpers
(commit)ลบการสนับสนุนที่ถูกเลิกใช้งานในการกำหนดเส้นทางด้วยตัวเลือก
:to
ที่ไม่มี#
(commit)ลบ
ActionDispatch::Response#to_ary
ที่ถูกเลิกใช้งาน (commit)ลบ
ActionDispatch::Request#deep_munge
ที่ถูกเลิกใช้งาน (commit)ลบ
ActionDispatch::Http::Parameters#symbolized_path_parameters
ที่ถูกเลิกใช้งาน (commit)ลบตัวเลือก
use_route
ที่ถูกเลิกใช้งานในการทดสอบคอนโทรลเลอร์ (commit)ลบ
assigns
และassert_template
ทั้งสองฟังก์ชันถูกแยกออกเป็น rails-controller-testing gem (Pull Request)
4.2 การเลิกใช้งาน
เลิกใช้งานทั้งหมดของ
*_filter
callbacks และใช้*_action
callbacks แทน (Pull Request)เลิกใช้งาน
*_via_redirect
integration test methods ใช้follow_redirect!
ด้วยตนเองหลังจากการเรียกคำขอเพื่อให้เกิดพฤติกรรมเดียวกัน (Pull Request)เลิกใช้งาน
AbstractController#skip_action_callback
และใช้ skip_callback methods แต่ละตัวแทน (Pull Request)เลิกใช้งานตัวเลือก
:nothing
สำหรับเมธอดrender
(Pull Request)เลิกใช้งานการส่งพารามิเตอร์แรกเป็น
Hash
และสถานะเริ่มต้นสำหรับเมธอดhead
(Pull Request)เลิกใช้งานการใช้ชื่อคลาสของ middleware เป็นสตริงหรือสัญลักษณ์ ใช้ชื่อคลาสแทน (commit)
เลิกใช้งานการเข้าถึง MIME types ผ่านค่าคงที่ (เช่น
Mime::HTML
) ใช้ตัวดัชนีด้วยสัญลักษณ์แทน (เช่นMime[:html]
) (Pull Request)เลิกใช้งาน
redirect_to :back
และใช้redirect_back
ซึ่งยอมรับอาร์กิวเมนต์fallback_location
ที่ต้องการ ทำให้ไม่มีโอกาสเกิดRedirectBackError
(Pull Request)ActionDispatch::IntegrationTest
และActionController::TestCase
เลิกใช้งานอาร์กิวเมนต์ตำแหน่งในของ keyword arguments (Pull Request)เลิกใช้งานพารามิเตอร์เส้นทาง
:controller
และ:action
(Pull Request)เลิกใช้งานเมธอด env บนอินสแตนซ์ของคอนโทรลเลอร์ (commit)
ActionDispatch::ParamsParser
เลิกใช้งานและถูกนำออกจาก middleware stack เพื่อกำหนดค่า parameter parsers ให้ใช้ActionDispatch::Request.parameter_parsers=
(commit, commit)การเปลี่ยนแปลงที่สำคัญ
เพิ่ม
ActionController::Renderer
เพื่อเรียกใช้เทมเพลตที่ไม่ได้อยู่ในการกระทำของคอนโทรลเลอร์ (Pull Request)ย้ายไปใช้รูปแบบอาร์กิวเมนต์แบบคีย์เวิร์ดใน
ActionController::TestCase
และActionDispatch::Integration
วิธีการร้องขอ HTTP (Pull Request)เพิ่ม
http_cache_forever
เข้าไปใน Action Controller เพื่อให้เราสามารถเก็บแคชการตอบสนองที่ไม่หมดอายุได้ (Pull Request)ให้การเข้าถึง request variants ที่เป็นมิตรมากขึ้น (Pull Request)
สำหรับการกระทำที่ไม่มีเทมเพลตที่เกี่ยวข้อง ให้แสดงผล
head :no_content
แทนที่จะเกิดข้อผิดพลาด (Pull Request)เพิ่มความสามารถในการแทนที่ฟอร์มบิลเดอร์เริ่มต้นสำหรับคอนโทรลเลอร์ (Pull Request)
เพิ่มการสนับสนุนสำหรับแอป API-only
ActionController::API
ถูกเพิ่มเป็นตัวแทนของActionController::Base
สำหรับแอปพลิเคชันประเภทนี้ (Pull Request)ทำให้
ActionController::Parameters
ไม่สืบทอดจากHashWithIndifferentAccess
อีกต่อไป (Pull Request)ทำให้ง่ายต่อการเปิดใช้งาน
config.force_ssl
และconfig.ssl_options
โดยทำให้ไม่เสี่ยงต่อความเสี่ยงและง่ายต่อการปิดใช้งาน (Pull Request)เพิ่มความสามารถในการส่งคืนเฮดเดอร์อะไรก็ได้ให้กับ
ActionDispatch::Static
(Pull Request)เปลี่ยนค่าเริ่มต้นของ
protect_from_forgery
ให้เป็นfalse
(commit)ActionController::TestCase
จะถูกย้ายไปเป็น gem เองใน Rails 5.1 ใช้ActionDispatch::IntegrationTest
แทน (commit)Rails สร้าง ETags ที่อ่อนแอตามค่าเริ่มต้น (Pull Request)
การกระทำของคอนโทรลเลอร์ที่ไม่มีการเรียกใช้
render
และไม่มีเทมเพลตที่เกี่ยวข้องจะแสดงผลhead :no_content
โดยอัตโนมัติแทนที่จะเกิดข้อผิดพลาด (Pull Request 1, 2)เพิ่มตัวเลือกสำหรับ CSRF tokens ต่อฟอร์ม (Pull Request)
เพิ่มการเข้ารหัสคำขอและการแยกวิเคราะห์การตอบสนองในการทดสอบการรวมกัน (Pull Request)
เพิ่ม
ActionController#helpers
เพื่อให้เราสามารถเข้าถึงบริบทของวิวที่ระดับคอนโทรลเลอร์ได้ (Pull Request)ข้อความ flash ที่ถูกละทิ้งจะถูกลบออกก่อนจัดเก็บลงในเซสชัน (Pull Request)
เพิ่มการสนับสนุนในการส่งคอลเลกชันของเร็คคอร์ดไปยัง
fresh_when
และstale?
(Pull Request)ActionController::Live
เป็นActiveSupport::Concern
แล้ว ซึ่ง หมายความว่าไม่สามารถรวมมันเข้ากับโมดูลอื่นๆ โดยเพียงแค่รวมมันเข้ากับActiveSupport::Concern
หรือActionController::Live
จะไม่มีผลในการใช้งานจริง บางคนอาจใช้โมดูลอื่นเพื่อรวมรหัสการจัดการข้อผิดพลาดของการตรวจสอบความถูกต้องของWarden
/Devise
ด้วยเนื่องจากมิดเวร์ไม่สามารถจับ:warden
ที่ถูกส่งออกโดยเธรดที่ถูกสร้างขึ้นได้ซึ่งเป็นกรณีเมื่อใช้ActionController::Live
(รายละเอียดเพิ่มเติมในปัญหานี้)แนะนำ
Response#strong_etag=
และ#weak_etag=
และตัวเลือกที่คล้ายกันสำหรับfresh_when
และstale?
. (Pull Request)
5 Action View
โปรดอ้างอิงที่ Changelog สำหรับการเปลี่ยนแปลงที่ละเอียด
5.1 การลบ
ลบ
AbstractController::Base::parent_prefixes
ที่ถูกยกเลิกแล้ว (commit)ลบ
ActionView::Helpers::RecordTagHelper
ฟังก์ชันนี้ถูกแยกออกเป็น record_tag_helper gem (Pull Request)ลบตัวเลือก
:rescue_format
สำหรับtranslate
helper เนื่องจากไม่ได้รับการสนับสนุนจาก I18n อีกต่อไป (Pull Request)
5.2 การเปลี่ยนแปลงที่สำคัญ
เปลี่ยน template handler เริ่มต้นจาก
ERB
เป็นRaw
(commit)การเรียกใช้งาน collection rendering สามารถแคชและดึง partials หลายๆ อันพร้อมกันได้ (Pull Request, commit)
เพิ่มการจับคู่ wildcard ใน explicit dependencies (Pull Request)
ทำให้
disable_with
เป็นพฤติกรรมเริ่มต้นสำหรับ submit tags ปิดใช้งานปุ่มเมื่อส่งฟอร์มเพื่อป้องกันการส่งซ้ำ (Pull Request)ชื่อ partial template ไม่จำเป็นต้องเป็นตัวระบุ Ruby ที่ถูกต้องอีกต่อไป (commit)
datetime_tag
helper ตอนนี้สร้างแท็ก input ด้วยประเภทdatetime-local
(Pull Request)อนุญาตให้ใช้งาน blocks ในขณะที่ render ด้วย
render partial:
helper (Pull Request)
6 Action Mailer
โปรดอ้างอิงที่ Changelog สำหรับการเปลี่ยนแปลงที่ละเอียด
6.1 การลบ
ลบ
*_path
helpers ที่ถูกยกเลิกใน email views (commit)ลบ
deliver
และdeliver!
methods ที่ถูกยกเลิก (commit)
6.2 การเปลี่ยนแปลงที่สำคัญ
การค้นหา template ตอนนี้เคารพ default locale และ I18n fallbacks (commit)
เพิ่ม
_mailer
suffix ให้กับ mailers ที่สร้างผ่าน generator ตามหลักการตั้งชื่อเดียวกับ controllers และ jobs (Pull Request)เพิ่ม
assert_enqueued_emails
และassert_no_enqueued_emails
(Pull Request)เพิ่มการกำหนดค่า
config.action_mailer.deliver_later_queue_name
เพื่อตั้งค่าชื่อคิวของ mailer (Pull Request)เพิ่มการสนับสนุน fragment caching ใน Action Mailer views เพิ่มตัวเลือกการกำหนดค่าใหม่
config.action_mailer.perform_caching
เพื่อกำหนดว่า template ของคุณควรทำ caching หรือไม่ (Pull Request)
7 Active Record
โปรดอ้างอิงที่ Changelog สำหรับการเปลี่ยนแปลงที่ละเอียด
7.1 การลบ
ลบพฤติกรรมที่ถูกยกเลิกที่อนุญาตให้ส่งผ่าน nested arrays เป็นค่า query (Pull Request)
ลบ
ActiveRecord::Tasks::DatabaseTasks#load_schema
ที่ถูกยกเลิกแล้ว วิธีนี้ถูกแทนที่ด้วยActiveRecord::Tasks::DatabaseTasks#load_schema_for
(commit)ลบ
serialized_attributes
ที่ถูกยกเลิกแล้ว (commit)ลบการนับแบบอัตโนมัติที่ถูกยกเลิกแล้วใน
has_many :through
(commit)ลบ
sanitize_sql_hash_for_conditions
ที่ถูกยกเลิกแล้ว (commit)ลบ
Reflection#source_macro
ที่ถูกยกเลิกแล้ว (commit)ลบ
symbolized_base_class
และsymbolized_sti_name
ที่ถูกยกเลิกแล้ว (commit)ลบ
ActiveRecord::Base.disable_implicit_join_references=
ที่ถูกยกเลิกแล้ว (commit)ลบการเข้าถึงการกำหนดค่าการเชื่อมต่อด้วยตัวเข้าถึงสตริงที่ถูกยกเลิกแล้ว (commit)
ลบการสนับสนุนการโหลดล่วงหน้าของการเชื่อมโยงที่ขึ้นอยู่กับอินสแตนซ์ที่ถูกยกเลิกแล้ว (commit)
ลบการสนับสนุนระดับเดียวกันสำหรับ PostgreSQL ranges ที่มีขอบเขตล่างที่เป็นแบบเฉพาะ (commit)
ลบการเตือนเมื่อแก้ไขความสัมพันธ์ด้วย Arel ที่มีการแคช นี่จะเรียกข้อผิดพลาด
ImmutableRelation
แทน (commit)ลบ
ActiveRecord::Serialization::XmlSerializer
ออกจากคอร์ คุณลักษณะนี้ถูกแยกออกเป็น activemodel-serializers-xml gem. (Pull Request)ลบการสนับสนุนสำหรับแอดาปเตอร์ฐานข้อมูล
mysql
เวอร์ชันเก่าออกจากคอร์ ผู้ใช้ส่วนใหญ่ควรใช้mysql2
แทน จะถูกแปลงเป็น gem แยกเมื่อเราพบคนที่จะดูแลรักษา (Pull Request 1, Pull Request 2)ลบการสนับสนุนสำหรับแพ็กเกจ
protected_attributes
(commit)ลบการสนับสนุนสำหรับเวอร์ชัน PostgreSQL ต่ำกว่า 9.1 (Pull Request)
ลบการสนับสนุนสำหรับแพ็กเกจ
activerecord-deprecated_finders
(commit)ลบค่าคงที่
ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES
(commit)
7.2 การเตือนเกี่ยวกับการใช้งานที่ถูกยกเลิก
เตือนการส่งคลาสเป็นค่าในคิวรี ผู้ใช้ควรส่งสตริงแทน (Pull Request)
เตือนการส่งค่า
false
เพื่อหยุดการทำงานของ Active Record callback วิธีที่แนะนำคือให้throw(:abort)
แทน (Pull Request)เตือน
ActiveRecord::Base.errors_in_transactional_callbacks=
(commit)เตือนการใช้
Relation#uniq
ให้ใช้Relation#distinct
แทน (commit)เตือนประเภท
:point
ของ PostgreSQL ให้ใช้ประเภทใหม่ที่จะคืนค่าเป็นPoint
แทนArray
(Pull Request)เตือนการโหลดข้อมูลใหม่ของสมาชิกด้วยการส่งอาร์กิวเมนต์ที่เป็นจริงให้กับเมธอดการเชื่อมโยง (Pull Request)
เตือนการใช้ชื่อคีย์สำหรับข้อผิดพลาดของ
restrict_dependent_destroy
ให้ใช้ชื่อคีย์ใหม่แทน (Pull Request)ปรับปรุงพฤติกรรมของ
#tables
(Pull Request)เตือนให้ใช้
SchemaCache#tables
,SchemaCache#table_exists?
และSchemaCache#clear_table_cache!
ในแหล่งข้อมูลใหม่ของพวกเขา (Pull Request)ยกเลิกการใช้งาน
connection.tables
ใน SQLite3 และ MySQL adapters. (Pull Request)ยกเลิกการส่งอาร์กิวเมนต์ไปยัง
#tables
- เมธอด#tables
ของ adapters บางตัว (mysql2, sqlite3) จะส่งคืนทั้งตารางและวิว ในขณะที่ adapters อื่น (postgresql) จะส่งคืนเฉพาะตารางเท่านั้น ในอนาคต#tables
จะส่งคืนเฉพาะตารางเท่านั้นเพื่อให้พฤติกรรมของมันสอดคล้องกัน (Pull Request)ยกเลิกการใช้งาน
table_exists?
- เมธอด#table_exists?
จะตรวจสอบทั้งตารางและวิว ในอนาคต#table_exists?
จะตรวจสอบเฉพาะตารางเท่านั้นเพื่อให้พฤติกรรมของมันสอดคล้องกันกับ#tables
(Pull Request)ยกเลิกการส่งอาร์กิวเมนต์
offset
ไปยังfind_nth
โปรดใช้เมธอดoffset
บน relation แทน (Pull Request)ยกเลิก
{insert|update|delete}_sql
ในDatabaseStatements
ใช้เมธอด{insert|update|delete}
สาธารณะแทน (Pull Request)ยกเลิกการใช้งาน
use_transactional_fixtures
เพื่อเปลี่ยนเป็นuse_transactional_tests
เพื่อความชัดเจนมากขึ้น (Pull Request)ยกเลิกการส่งคอลัมน์ไปยัง
ActiveRecord::Connection#quote
(commit)เพิ่มตัวเลือก
end
ให้กับfind_in_batches
เพื่อระบุที่จะหยุดการประมวลผลแบทช์ (Pull Request)
7.3 การเปลี่ยนแปลงที่สำคัญ
เพิ่มตัวเลือก
foreign_key
ให้กับreferences
เมื่อสร้างตาราง (commit)เพิ่ม attributes API (commit)
เพิ่มตัวเลือก
:_prefix
/:_suffix
ให้กับการกำหนดenum
(Pull Request, Pull Request)เพิ่ม
#cache_key
ให้กับActiveRecord::Relation
(Pull Request)เปลี่ยนค่า
null
เริ่มต้นของtimestamps
เป็นfalse
(commit)เพิ่ม
ActiveRecord::SecureToken
เพื่อแยกการสร้างโทเค็นที่ไม่ซ้ำกันสำหรับแอตทริบิวต์ในโมเดลโดยใช้SecureRandom
(Pull Request)เพิ่มตัวเลือก
:if_exists
ให้กับdrop_table
(Pull Request)เพิ่ม
ActiveRecord::Base#accessed_fields
ซึ่งสามารถใช้ค้นพบฟิลด์ที่ถูกอ่านจากโมเดลได้อย่างรวดเร็วเมื่อคุณต้องการเลือกข้อมูลที่คุณต้องการจากฐานข้อมูล (commit)เพิ่มเมธอด
#or
ให้กับActiveRecord::Relation
เพื่ออนุญาตให้ใช้ตัวดำเนินการ OR เพื่อรวม WHERE หรือ HAVING clauses (commit)เพิ่ม
ActiveRecord::Base.suppress
เพื่อป้องกันการบันทึก receiver ในระหว่างการทำงานของบล็อกที่กำหนด (Pull Request)belongs_to
จะเริ่มทำให้เกิดข้อผิดพลาดการตรวจสอบโดยค่าเริ่มต้นหากไม่มีการเชื่อมโยง คุณสามารถปิดการใช้งานนี้ได้ตามการเชื่อมโยงแต่ละตัวด้วยoptional: true
ยังยกเลิกการใช้งานตัวเลือกrequired
เพื่อเปลี่ยนเป็นoptional
สำหรับbelongs_to
(Pull Request)เพิ่ม
config.active_record.dump_schemas
เพื่อกำหนดพฤติกรรมของdb:structure:dump
. (Pull Request)เพิ่มตัวเลือก
config.active_record.warn_on_records_fetched_greater_than
. (Pull Request)เพิ่มการสนับสนุนชนิดข้อมูล JSON ใน MySQL. (Pull Request)
เพิ่มการสนับสนุนการลบดัชนีพร้อมกันใน PostgreSQL. (Pull Request)
เพิ่มเมธอด
#views
และ#view_exists?
ในตัวอักษรเชื่อมต่อ. (Pull Request)เพิ่ม
ActiveRecord::Base.ignored_columns
เพื่อทำให้คอลัมน์บางคอลัมน์ สามารถถูกซ่อนจาก Active Record ได้. (Pull Request)เพิ่ม
connection.data_sources
และconnection.data_source_exists?
. เมธอดเหล่านี้กำหนดว่าความสัมพันธ์ใดสามารถใช้เป็นฐานสำหรับ Active Record โมเดล (โดย通常จะเป็นตารางและมุมมอง). (Pull Request)อนุญาตให้ไฟล์ค่าเริ่มต้นตั้งค่าคลาสโมเดลในไฟล์ YAML เอง. (Pull Request)
เพิ่มความสามารถในการตั้งค่าเป็น
uuid
เป็นคีย์หลักเมื่อสร้างการเปลี่ยนแปลงฐานข้อมูล (Pull Request)เพิ่ม
ActiveRecord::Relation#left_joins
และActiveRecord::Relation#left_outer_joins
. (Pull Request)เพิ่ม
after_{create,update,delete}_commit
callbacks. (Pull Request)เวอร์ชัน API ที่นำเสนอให้กับคลาสการเรียกใช้งานเพื่อให้เราสามารถเปลี่ยนค่าเริ่มต้นของพารามิเตอร์ได้ โดยไม่ทำให้การเปลี่ยนแปลงฉบับเก่าเสียหาย หรือบังคับให้เขียนใหม่ผ่านรอบการเลิกใช้งาน (Pull Request)
ApplicationRecord
เป็นคลาสแม่ใหม่สำหรับโมเดลแอป คล้ายกับการสืบทอดคลาสควบคุมแอป ที่สืบทอดจากApplicationController
แทนที่จะสืบทอดจากActionController::Base
สิ่งนี้ช่วยให้แอปมีจุดเดียวสำหรับกำหนดพฤติกรรมของโมเดลทั่วไปในแอป (Pull Request)เพิ่มเมธอด
ActiveRecord
#second_to_last
และ#third_to_last
. (Pull Request)เพิ่มความสามารถในการเพิ่มคำอธิบายให้กับวัตถุฐานข้อมูล (ตาราง คอลัมน์ ดัชนี) ด้วยความคิดเห็นที่เก็บไว้ในข้อมูลเมตาดาต้าเบสสำหรับ PostgreSQL และ MySQL. (Pull Request)
เพิ่มการสนับสนุนคำสั่งเตรียมใช้งานในตัวเลือก
mysql2
adapter, สำหรับ mysql2 0.4.4+ ก่อนหน้านี้เฉพาะ adaptermysql
ที่ถูกยกเลิกเท่านั้นที่รองรับ เพื่อเปิดใช้งาน ตั้งค่าprepared_statements: true
ในconfig/database.yml
. (Pull Request)เพิ่มความสามารถในการเรียกใช้งาน
ActionRecord::Relation#update
บนวัตถุความสัมพันธ์ ซึ่งจะเรียกใช้งานการตรวจสอบความถูกต้องใน callback บนวัตถุทั้งหมดในความสัมพันธ์ (Pull Request)เพิ่มตัวเลือก
:touch
ในเมธอดsave
เพื่อบันทึกบันทึกโดยไม่ต้องอัปเดตเวลา. (Pull Request)เพิ่มการสนับสนุนดัชนีแสดงออกและคลาสตัวดำเนินการสำหรับ PostgreSQL. (commit)
เพิ่ม
:index_errors
option เพื่อเพิ่มดัชนีให้กับข้อผิดพลาดของแอตทริบิวต์ที่ซ้อนกัน (Pull Request)เพิ่มการสนับสนุนสำหรับการลบข้อมูลที่เกี่ยวข้องกันทั้งสองทิศทาง (Pull Request)
เพิ่มการสนับสนุนสำหรับ
after_commit
callbacks ในการทดสอบที่มีการทำธุรกรรม (Pull Request)เพิ่มเมธอด
foreign_key_exists?
เพื่อตรวจสอบว่ามี foreign key อยู่ในตารางหรือไม่ (Pull Request)เพิ่ม
:time
option ให้กับเมธอดtouch
เพื่อทำการ touch บันทึกที่มีเวลาต่างจากเวลาปัจจุบัน (Pull Request)เปลี่ยน transaction callbacks เพื่อไม่ให้กลืนข้อผิดพลาด ก่อนการเปลี่ยนแปลงนี้ ข้อผิดพลาดใด ๆ ที่เกิดขึ้นภายใน transaction callback จะถูกบันทึกและแสดงในบันทึก ยกเว้นถ้าคุณใช้ ตัวเลือก
raise_in_transactional_callbacks = true
(ที่ถูกเพิกเฉยแล้ว)ตอนนี้ข้อผิดพลาดเหล่านี้จะไม่ถูกบันทึกและเพียงแค่แผ่ขึ้นมาเท่านั้น ทำให้เหมือนกับพฤติกรรมของ callback อื่น ๆ (commit)
8 Active Model
โปรดอ้างอิงที่ Changelog สำหรับการเปลี่ยนแปลงที่ละเอียด
8.1 การลบ
ลบ
ActiveModel::Dirty#reset_#{attribute}
และActiveModel::Dirty#reset_changes
ที่ถูกเลิกใช้งาน (Pull Request)ลบการซีเรียลไซเซชัน XML คุณลักษณะนี้ถูกแยกออกเป็น activemodel-serializers-xml gem (Pull Request)
ลบโมดูล
ActionController::ModelNaming
(Pull Request)
8.2 การเลิกใช้งาน
เลิกใช้การส่งคืน
false
เป็นวิธีหยุด Active Model และ โฟลว์ของ callback ของActiveModel::Validations
วิธีที่แนะนำคือthrow(:abort)
(Pull Request)เลิกใช้
ActiveModel::Errors#get
,ActiveModel::Errors#set
และActiveModel::Errors#[]=
เมธอดที่มีพฤติกรรมที่ไม่สม่ำเสมอ (Pull Request)เลิกใช้ตัวเลือก
:tokenizer
สำหรับvalidates_length_of
, เพื่อใช้ Ruby ธรรมดาแทน (Pull Request)เลิกใช้
ActiveModel::Errors#add_on_empty
และActiveModel::Errors#add_on_blank
โดยไม่มีการแทนที่ (Pull Request)
8.3 การเปลี่ยนแปลงที่สำคัญ
เพิ่ม
ActiveModel::Errors#details
เพื่อกำหนดว่า validator ไหนที่ล้มเหลว (Pull Request)แยก
ActiveRecord::AttributeAssignment
เป็นActiveModel::AttributeAssignment
ที่อนุญาตให้ใช้สำหรับวัตถุใด ๆ เป็นโมดูลที่สามารถรวมได้ (Pull Request)เพิ่ม
ActiveModel::Dirty#[attr_name]_previously_changed?
และActiveModel::Dirty#[attr_name]_previous_change
เพื่อเพิ่มการเข้าถึง การเปลี่ยนแปลงที่บันทึกไว้หลังจากบันทึกโมเดลแล้ว (Pull Request)ตรวจสอบ multiple contexts ใน
valid?
และinvalid?
พร้อมกัน (Pull Request)เปลี่ยน
validates_acceptance_of
เพื่อยอมรับค่าเริ่มต้นเป็นtrue
นอกเหนือจาก1
(Pull Request)Active Job
โปรดอ้างอิง Changelog สำหรับการเปลี่ยนแปลงที่ละเอียด
8.4 การเปลี่ยนแปลงที่สำคัญ
ActiveJob::Base.deserialize
ส่งงานไปยังคลาสงาน ซึ่งทำให้งานสามารถแนบข้อมูลเพิ่มเติมได้เมื่อถูกซีเรียลไลซ์และอ่านกลับเมื่อถูกดำเนินการ (Pull Request)เพิ่มความสามารถในการกำหนดค่าแอดาปเตอร์คิวบนพื้นฐานของงานแต่ละงานโดยไม่มีผลต่องานอื่น ๆ (Pull Request)
งานที่สร้างขึ้นตอนนี้จะสืบทอดจาก
app/jobs/application_job.rb
โดยค่าเริ่มต้น (Pull Request)อนุญาตให้
DelayedJob
,Sidekiq
,qu
,que
, และqueue_classic
รายงานรหัสงานกลับไปยังActiveJob::Base
เป็นprovider_job_id
(Pull Request, Pull Request, commit)สร้าง
AsyncJob
processor ที่เรียกใช้งานAsyncAdapter
ที่เก็บงานไว้ในconcurrent-ruby
thread pool (Pull Request)เปลี่ยนแปลงแอดาปเตอร์เริ่มต้นจาก inline เป็น async ซึ่งเป็นค่าเริ่มต้นที่ดีกว่าเนื่องจากการทดสอบจะไม่พลาดการทำงานที่เกิดขึ้นแบบเสมอ (commit)
9 Active Support
โปรดอ้างอิง Changelog สำหรับการเปลี่ยนแปลงที่ละเอียด
9.1 การลบ
ลบ
ActiveSupport::JSON::Encoding::CircularReferenceError
ที่ถูกยกเลิก (commit)ลบเมธอดที่ถูกยกเลิก
ActiveSupport::JSON::Encoding.encode_big_decimal_as_string=
และActiveSupport::JSON::Encoding.encode_big_decimal_as_string
(commit)ลบ
ActiveSupport::SafeBuffer#prepend
ที่ถูกยกเลิก (commit)ลบเมธอดที่ถูกยกเลิกจาก
Kernel
คือsilence_stderr
,silence_stream
,capture
และquietly
(commit)ลบไฟล์
active_support/core_ext/big_decimal/yaml_conversions
ที่ถูกยกเลิก (commit)ลบเมธอดที่ถูกยกเลิก
ActiveSupport::Cache::Store.instrument
และActiveSupport::Cache::Store.instrument=
(commit)ลบ
Class#superclass_delegating_accessor
ที่ถูกยกเลิก ใช้Class#class_attribute
แทน (Pull Request)ลบ
ThreadSafe::Cache
ใช้Concurrent::Map
แทน (Pull Request)ลบ
Object#itself
เนื่องจากมีการนำมาใช้ใน Ruby 2.2 (Pull Request)
9.2 การเลิกใช้
เลิกใช้
MissingSourceFile
และใช้LoadError
แทน (commit)เลิกใช้
alias_method_chain
และใช้Module#prepend
ที่ถูกนำเสนอใน Ruby 2.0 แทน (Pull Request)เลิกใช้
ActiveSupport::Concurrency::Latch
และใช้Concurrent::CountDownLatch
จาก concurrent-ruby แทน (Pull Request)เลิกใช้ตัวเลือก
:prefix
ของnumber_to_human_size
โดยไม่มีตัวแทน (Pull Request)เลิกใช้
Module#qualified_const_
และใช้เมธอดModule#const_
ที่มีอยู่แทน (Pull Request)เลิกใช้การส่งสตริงเพื่อกำหนดค่า callback (Pull Request)
เลิกใช้
ActiveSupport::Cache::Store#namespaced_key
,ActiveSupport::Cache::MemCachedStore#escape_key
, และActiveSupport::Cache::FileStore#key_file_path
ใช้normalize_key
แทน (Pull Request, commit)ปรับใช้
write_cache_value
แทนActiveSupport::Cache::LocaleCache#set_cache_value
ที่ถูกยกเลิกแล้ว (Pull Request)ปรับใช้ไม่ส่งอาร์กิวเมนต์ให้กับ
assert_nothing_raised
ที่ถูกยกเลิกแล้ว (Pull Request)ปรับใช้
Module.constants(false)
แทนModule.local_constants
ที่ถูกยกเลิกแล้ว (Pull Request)
9.3 การเปลี่ยนแปลงที่สำคัญ
เพิ่มเมธอด
#verified
และ#valid_message?
ในActiveSupport::MessageVerifier
(Pull Request)เปลี่ยนวิธีหยุดการทำงานของ callback chains โดยวิธีที่แนะนำในการหยุด callback chain ตอนนี้คือการใช้
throw(:abort)
โดยชัดเจน (Pull Request)เพิ่มตัวเลือกการกำหนดค่าใหม่
config.active_support.halt_callback_chains_on_return_false
เพื่อระบุว่า ActiveRecord, ActiveModel, และ ActiveModel::Validations callback chains สามารถหยุดได้โดยการส่งค่าfalse
ใน 'before' callback (Pull Request)เปลี่ยนการเรียงลำดับทดสอบเริ่มต้นจาก
:sorted
เป็น:random
(commit)เพิ่มเมธอด
#on_weekend?
,#on_weekday?
,#next_weekday
,#prev_weekday
ในDate
,Time
, และDateTime
(Pull Request, Pull Request)เพิ่มตัวเลือก
same_time
ใน#next_week
และ#prev_week
สำหรับDate
,Time
, และDateTime
(Pull Request)เพิ่ม
#prev_day
และ#next_day
เป็นคู่กับ#yesterday
และ#tomorrow
สำหรับDate
,Time
, และDateTime
(Pull Request)เพิ่ม
SecureRandom.base58
เพื่อสร้างสตริง base58 แบบสุ่ม (commit)เพิ่ม
file_fixture
ในActiveSupport::TestCase
เพื่อให้สามารถเข้าถึงไฟล์ตัวอย่างในกรณีทดสอบได้ง่าย (Pull Request)เพิ่ม
#without
ในEnumerable
และArray
เพื่อคืนค่าสำเนาของ enumerable โดยไม่รวมสมาชิกที่ระบุ (Pull Request)เพิ่ม
ActiveSupport::ArrayInquirer
และArray#inquiry
(Pull Request)เพิ่ม
ActiveSupport::TimeZone#strptime
เพื่อให้สามารถแปลงเวลาเป็นตามเขตเวลาที่กำหนดได้ (commit)เพิ่มเมธอดค้นหา
Integer#positive?
และInteger#negative?
ในลักษณะเดียวกับInteger#zero?
(commit)เพิ่มเวอร์ชัน bang ในเมธอด get ของ
ActiveSupport::OrderedOptions
ซึ่งจะเกิดข้อผิดพลาดKeyError
หากค่าเป็น.blank?
(Pull Request)เพิ่ม
Time.days_in_year
เพื่อคืนค่าจำนวนวันในปีที่กำหนดหรือปีปัจจุบันหากไม่มีอาร์กิวเมนต์ (commit)เพิ่มตัวตรวจสอบไฟล์แบบ evented เพื่อตรวจหาการเปลี่ยนแปลงในรหัสต้นฉบับของแอปพลิเคชัน เส้นทาง ภาษาท้องถิ่น เป็นต้น (Pull Request)
เพิ่มชุดเมธอด thread_m/cattr_accessor/reader/writer เพื่อประกาศตัวแปรคลาสและโมดูลที่อยู่ในแต่ละเธรด (Pull Request)
เพิ่ม
Array#second_to_last
และArray#third_to_last
methods. (Pull Request)เผยแพร่
ActiveSupport::Executor
และActiveSupport::Reloader
APIs เพื่ออนุญาตให้คอมโพเนนต์และไลบรารีสามารถจัดการและมีส่วนร่วมในกระบวนการประมวลผลของโค้ดแอปพลิเคชันและกระบวนการโหลดแอปพลิเคชันใหม่ (Pull Request)ActiveSupport::Duration
ตอนนี้สนับสนุนการจัดรูปแบบและการแปลงข้อมูลตามมาตรฐาน ISO8601 (Pull Request)ActiveSupport::JSON.decode
ตอนนี้สนับสนุนการแปลงข้อมูลเวลาท้องถิ่น ISO8601 เมื่อเปิดใช้งานparse_json_times
(Pull Request)ActiveSupport::JSON.decode
ตอนนี้ส่งคืนออบเจ็กต์Date
สำหรับสตริงวันที่ (Pull Request)เพิ่มความสามารถให้กับ
TaggedLogging
เพื่ออนุญาตให้สร้างตัวเรกคอร์เดอร์ได้หลายครั้งเพื่อให้ไม่แชร์แท็กกับกัน (Pull Request)
10 เครดิต
ดู รายชื่อผู้มีส่วนร่วมทั้งหมดใน Rails สำหรับผู้ที่ใช้เวลาหลายชั่วโมงในการสร้าง Rails เป็นเฟรมเวิร์กที่เสถียรและแข็งแกร่ง ยินดีด้วยทุกคน
ข้อเสนอแนะ
คุณสามารถช่วยปรับปรุงคุณภาพของคู่มือนี้ได้
กรุณาช่วยเพิ่มเติมหากพบข้อผิดพลาดหรือข้อผิดพลาดทางความจริง เพื่อเริ่มต้นคุณสามารถอ่านส่วน การสนับสนุนเอกสาร ของเราได้
คุณอาจพบเนื้อหาที่ไม่สมบูรณ์หรือเนื้อหาที่ไม่ได้อัปเดต กรุณาเพิ่มเอกสารที่ขาดหายไปสำหรับเนื้อหาหลัก โปรดตรวจสอบ Edge Guides ก่อนเพื่อตรวจสอบ ว่าปัญหาได้รับการแก้ไขหรือไม่ในสาขาหลัก ตรวจสอบ คู่มือแนวทาง Ruby on Rails เพื่อดูรูปแบบและกฎเกณฑ์
หากคุณพบข้อผิดพลาดแต่ไม่สามารถแก้ไขได้เอง กรุณา เปิดปัญหา.
และสุดท้าย การสนทนาใด ๆ เกี่ยวกับ Ruby on Rails เอกสารยินดีต้อนรับที่สุดใน เว็บบอร์ดอย่างเป็นทางการของ Ruby on Rails.