1 การอัพเกรดไปยัง Rails 3.2
หากคุณกำลังอัพเกรดแอปพลิเคชันที่มีอยู่อยู่ คุณควรมีการทดสอบที่ดีก่อนที่จะเริ่มต้น คุณควรอัพเกรดไปยัง Rails 3.1 ก่อนหากคุณยังไม่ได้ทำ และตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณยังทำงานได้ตามที่คาดหวังก่อนที่จะพยายามอัพเดตไปยัง Rails 3.2 จากนั้นให้ทำตามขั้นตอนต่อไปนี้:
1.1 Rails 3.2 ต้องการ Ruby 1.8.7 หรือสูงกว่า
Rails 3.2 ต้องการ Ruby 1.8.7 หรือสูงกว่า การสนับสนุนสำหรับเวอร์ชัน Ruby ก่อนหน้านี้ทั้งหมดถูกยกเลิกอย่างเป็นทางการและคุณควรอัพเกรดให้เร็วที่สุด Rails 3.2 ยังเข้ากันได้กับ Ruby 1.9.2
เคล็ดลับ: โปรดทราบว่า Ruby 1.8.7 p248 และ p249 มีข้อบกพร่องในการมาร์ชลิ่งที่ทำให้ Rails ล้มเหลว แต่ Ruby Enterprise Edition ได้แก้ไขปัญหาเหล่านี้ตั้งแต่เวอร์ชัน 1.8.7-2010.02 ในด้านของ Ruby 1.9 รุ่น 1.9.1 ไม่สามารถใช้งานได้เพราะมีข้อผิดพลาดที่รุนแรง ดังนั้นหากคุณต้องการใช้ 1.9.x โปรดเลือกใช้ 1.9.2 หรือ 1.9.3 เพื่อความราบรื่นในการทำงาน
1.2 อัพเดตในแอปพลิเคชันของคุณ
อัพเดต
Gemfile
ของคุณให้ขึ้นอยู่กับrails = 3.2.0
sass-rails ~> 3.2.3
coffee-rails ~> 3.2.1
uglifier >= 1.0.3
Rails 3.2 ยกเลิกการใช้
vendor/plugins
และ Rails 4.0 จะลบออกเป็นอย่างสมบูรณ์ คุณสามารถเริ่มแทนที่ปลั๊กอินเหล่านี้โดยการแยกเป็นแพ็คเกจและเพิ่มในGemfile
หากคุณเลือกที่จะไม่ทำให้เป็นแพ็คเกจ คุณสามารถย้ายไปที่, ตัวอย่างเช่น,lib/my_plugin/*
และเพิ่มตัวกำหนดเริ่มต้นที่เหมาะสมในconfig/initializers/my_plugin.rb
มีการเปลี่ยนแปลงการกำหนดค่าใหม่สองรายการที่คุณต้องการเพิ่มใน
config/environments/development.rb
:# ยกเว้นการป้องกันการกำหนดค่าจำนวนมากสำหรับโมเดล Active Record config.active_record.mass_assignment_sanitizer = :strict # บันทึกแผนการคิวสำหรับคำสั่งคิวที่ใช้เวลามากกว่านี้ (ทำงานกับ SQLite, MySQL, และ PostgreSQL) config.active_record.auto_explain_threshold_in_seconds = 0.5
การกำหนดค่า
mass_assignment_sanitizer
ยังต้องเพิ่มในconfig/environments/test.rb
:# ยกเว้นการป้องกันการกำหนดค่าจำนวนมากสำหรับโมเดล Active Record config.active_record.mass_assignment_sanitizer = :strict
1.3 อัพเดตในเอ็นจินของคุณ
แทนที่รหัสภายใต้คำอธิบายใน script/rails
ด้วยเนื้อหาต่อไปนี้:
ENGINE_ROOT = File.expand_path('../..', __FILE__)
ENGINE_PATH = File.expand_path('../../lib/your_engine_name/engine', __FILE__)
require "rails/all"
require "rails/engine/commands"
2 การสร้างแอปพลิเคชัน Rails 3.2
# คุณควรมี RubyGem 'rails' ติดตั้งแล้ว
$ rails new myapp
$ cd myapp
2.1 การจัดเก็บ Gems
Rails ใช้ Gemfile
ในรากแอปพลิเคชันเพื่อกำหนด Gems ที่คุณต้องการให้แอปพลิเคชันเริ่มต้น ไฟล์ Gemfile
นี้จะถูกประมวลผลโดย Bundler gem ซึ่งจากนั้นจะติดตั้ง dependencies ทั้งหมดของคุณ มันยังสามารถติดตั้ง dependencies ทั้งหมดไปยังแอปพลิเคชันของคุณในที่เดียวเพื่อไม่ต้องพึ่งพา Gems ของระบบ
ข้อมูลเพิ่มเติม: Bundler homepage
2.2 การใช้งานรุ่นล่าสุด
Bundler
และ Gemfile
ทำให้การแชร์แอปพลิเคชัน Rails ของคุณเป็นเรื่องง่ายดายด้วยคำสั่ง bundle
ที่เป็นเฉพาะ หากคุณต้องการที่จะแบนเดียวจาก Git repository คุณสามารถส่งพารามิเตอร์ --edge
ได้
bash
$ rails new myapp --edge
หากคุณมีการเช็คเอาท์ท้องถิ่นของเรลส์และต้องการสร้างแอปพลิเคชันโดยใช้เอาท์ท้องถิ่นนั้น คุณสามารถใช้ค่า --dev
:
$ ruby /path/to/rails/railties/bin/rails new myapp --dev
3 คุณสมบัติหลัก
3.1 โหมดการพัฒนาที่เร็วขึ้นและเราท์ติ้ง
เรลส์ 3.2 มาพร้อมกับโหมดการพัฒนาที่เร็วขึ้นอย่างมีนัยสำคัญ โดยได้รับแรงบันดาลใจจาก Active Reload เรลส์จะโหลดคลาสเฉพาะเมื่อไฟล์เปลี่ยนจริงๆ การเพิ่มประสิทธิภาพนี้เป็นอย่างมากในแอปพลิเคชันขนาดใหญ่ การรู้จักเราท์ก็ได้รับการเพิ่มประสิทธิภาพอีกด้วยด้วยเครื่องมือใหม่ Journey
3.2 การอธิบายคิวรีโดยอัตโนมัติ
เรลส์ 3.2 มาพร้อมกับคุณสมบัติที่น่าสนใจที่อธิบายคิวรีที่สร้างขึ้นโดย Arel โดยการกำหนดเมธอด explain
ใน ActiveRecord::Relation
ตัวอย่างเช่น คุณสามารถรันบางอย่างเช่น puts Person.active.limit(5).explain
และคิวรีที่ Arel สร้างขึ้นจะถูกอธิบาย สิ่งนี้ช่วยให้คุณตรวจสอบดัชนีที่เหมาะสมและการปรับปรุงเพิ่มเติม
คิวรีที่ใช้เวลาเกินครึ่งวินาทีในโหมดการพัฒนาจะถูกอธิบายโดยอัตโนมัติ แน่นอนว่าค่าเกณฑ์นี้สามารถเปลี่ยนได้
3.3 การเขียนล็อกแบบแท็ก
เมื่อทำงานกับแอปพลิเคชันที่มีผู้ใช้หลายคนและหลายบัญชี การสามารถกรองล็อกตามผู้ใช้งานคนไหนทำอะไรเป็นประโยชน์อย่างมาก TaggedLogging ใน Active Support ช่วยในการทำเช่นนั้นโดยการใส่ตราบรรทัดล็อกด้วย subdomains, request ids และอื่นๆ เพื่อช่วยในการแก้ปัญหาในแอปพลิเคชันเหล่านี้
4 เอกสาร
ตั้งแต่เรลส์ 3.2 เรลส์ไกด์มีให้ใช้สำหรับ Kindle และแอป Kindle Reading ฟรีสำหรับ iPad, iPhone, Mac, Android ฯลฯ
5 Railties
เพิ่มความเร็วในการพัฒนาโดยการโหลดคลาสเฉพาะเมื่อไฟล์ที่เกี่ยวข้องเปลี่ยนแปลง สามารถปิดการใช้งานได้โดยการตั้งค่า
config.reload_classes_only_on_change
เป็น falseแอปพลิเคชันใหม่ได้รับค่า
config.active_record.auto_explain_threshold_in_seconds
ในไฟล์การกำหนดค่าของ environment ด้วย มีค่าเป็น0.5
ในdevelopment.rb
และถูกคอมเมนท์ออกในproduction.rb
ไม่มีการกล่าวถึงในtest.rb
เพิ่ม
config.exceptions_app
เพื่อกำหนดแอปพลิเคชันข้อยกเว้นที่เรียกใช้งานโดย ShowException middleware เมื่อเกิดข้อยกเว้น ค่าเริ่มต้นคือActionDispatch::PublicExceptions.new(Rails.public_path)
เพิ่ม DebugExceptions middleware ซึ่งมีคุณสมบัติที่ถูกแยกออกมาจาก ShowExceptions middleware
แสดงเส้นทางของเอนจินที่มีการติดตั้งใน
rake routes
อนุญาตให้เปลี่ยนลำดับการโหลด railties ด้วย
config.railties_order
เช่น:config.railties_order = [Blog::Engine, :main_app, :all]
Scaffold ส่งคืน 204 No Content สำหรับ API requests ที่ไม่มีเนื้อหา ทำให้ scaffold ทำงานกับ jQuery ได้โดยอัตโนมัติ
อัปเดต Rails::Rack::Logger middleware เพื่อใช้แท็กที่ตั้งค่าใน
config.log_tags
กับ ActiveSupport::TaggedLogging นี้ทำให้ง่ายต่อการติดแท็กบรรทัดล็อกด้วยข้อมูลการแก้ปัญหาเช่น subdomain และ request id -- ทั้งคู่เป็นประโยชน์มากในการแก้ปัญหาในแอปพลิเคชันที่มีผู้ใช้งานหลายคนในสภาพการผลิตตัวเลือกเริ่มต้นสำหรับ
rails new
สามารถตั้งค่าได้ใน~/.railsrc
คุณสามารถระบุอาร์กิวเมนต์เพิ่มเติมที่จะใช้ทุกครั้งที่rails new
ทำงานในไฟล์การกำหนดค่า.railsrc
ในไดเรกทอรีบ้านของคุณเพิ่มการตั้งชื่อย่อ
d
สำหรับdestroy
สามารถใช้งานได้กับเอนจินเช่นกันแอตทริบิวต์ใน scaffold และ model generators มีค่าเริ่มต้นเป็น string นี้ช่วยให้สามารถใช้งานได้ดังนี้
bin/rails g scaffold Post title body:text author
อนุญาตให้ scaffold/model/migration generators รับ modifier "index" และ "uniq" เช่น
bin/rails g scaffold Post title:string:index author:uniq price:decimal{7,2}
จะสร้างดัชนีสำหรับ
title
และauthor
โดยตัวหลังเป็นดัชนีที่ไม่ซ้ำกัน บางประเภทเช่น decimal ยอมรับตัวเลือกที่กำหนดเอง ในตัวอย่างprice
จะเป็นคอลัมน์ decimal ที่มีความแม่นยำและมาตราส่วนที่ตั้งค่าเป็น 7 และ 2 ตามลำดับไฟล์ gem ถูกลบออกจาก
Gemfile
ค่าเริ่มต้นลบ generator เก่าของ plugin
rails generate plugin
และใช้คำสั่งrails plugin new
แทนลบ API เก่า
config.paths.app.controller
และใช้config.paths["app/controller"]
แทน
5.1 การเลิกใช้งาน
Rails::Plugin
ถูกเลิกใช้และจะถูกลบใน Rails 4.0 แทนที่จะเพิ่ม plugin ในvendor/plugins
ให้ใช้ gems หรือ bundler กับ path หรือ git dependencies
6 Action Mailer
อัพเกรดเวอร์ชัน
mail
เป็น 2.4.0ลบ API เก่าของ Action Mailer ที่ถูกเลิกใช้ตั้งแต่ Rails 3.0
7 Action Pack
7.1 Action Controller
ทำให้
ActiveSupport::Benchmarkable
เป็นโมดูลเริ่มต้นสำหรับActionController::Base
เพื่อให้เมธอด#benchmark
สามารถใช้งานใน context ของ controller ได้เหมือนเดิมเพิ่ม
:gzip
option ให้กับcaches_page
สามารถกำหนดค่าเริ่มต้นได้ global โดยใช้page_cache_compression
Rails จะใช้ layout เริ่มต้น (เช่น "layouts/application") เมื่อคุณระบุ layout ด้วยเงื่อนไข
:only
และ:except
และเงื่อนไขเหล่านั้นล้มเหลวclass CarsController layout 'single_car', :only => :show end
Rails จะใช้
layouts/single_car
เมื่อมีคำขอเข้ามาใน action:show
และใช้layouts/application
(หรือlayouts/cars
ถ้ามี) เมื่อมีคำขอเข้ามาใน actions อื่น ๆform_for
ถูกเปลี่ยนให้ใช้#{action}_#{as}
เป็น CSS class และ id ถ้ามี:as
option ถูกกำหนดไว้ เวอร์ชันก่อนหน้าใช้#{as}_#{action}
ActionController::ParamsWrapper
บน Active Record models ตอนนี้จะ wrap เฉพาะ attributes ที่กำหนดในattr_accessible
ถ้าไม่ได้กำหนด จะ wrap เฉพาะ attributes ที่ได้รับจากเมธอดคลาสattribute_names
เท่านั้น นี่แก้ปัญหาการ wrap nested attributes โดยเพิ่มเข้าไปในattr_accessible
บันทึก "Filter chain halted as CALLBACKNAME rendered or redirected" ทุกครั้งที่ before callback หยุด
ActionDispatch::ShowExceptions
ถูก refactor ตอนนี้ controller จะรับผิดชอบในการเลือกที่จะแสดง exceptions สามารถ overrideshow_detailed_exceptions?
ใน controllers เพื่อระบุว่าคำขอใดควรให้ข้อมูลการแก้ไขข้อผิดพลาดResponders ตอนนี้จะ return 204 No Content สำหรับ API requests ที่ไม่มี response body (เหมือน scaffold ใหม่)
ActionController::TestCase
ถูก refactor cookies ตอนนี้ควรใช้cookies[]
เพื่อกำหนดค่า cookies ใน test casescookies[:email] = '[email protected]' get :index assert_equal '[email protected]', cookies[:email]
เพื่อล้าง cookies ให้ใช้
clear
cookies.clear get :index assert_nil cookies[:email]
เราไม่ได้เขียน HTTP_COOKIE และ cookie jar จะยังคงอยู่ระหว่างคำขอเพื่อถ้าคุณต้องการแก้ไข environment สำหรับ test คุณต้องทำก่อนที่ cookie jar จะถูกสร้าง
send_file
ตอนนี้จะทาย MIME type จากนามสกุลไฟล์ถ้าไม่ได้ระบุ:type
เพิ่ม MIME type entries สำหรับ PDF, ZIP และรูปแบบอื่น ๆ
อนุญาตให้
fresh_when/stale?
รับ record แทนที่ options hashเปลี่ยนระดับ log ของ warning สำหรับ CSRF token ที่หายไปจาก
:debug
เป็น:warn
Assets ควรใช้ protocol ของคำขอเป็นค่าเริ่มต้นหรือถ้าไม่มีคำขอให้เป็น relative
7.1.1 การเลิกใช้งาน
เลิกใช้งานการค้นหา layout ที่ถูกนำมาใช้งานอัตโนมัติใน controllers ที่ parent มีการตั้งค่า layout แบบชัดเจน:
class ApplicationController layout "application" end class PostsController < ApplicationController end
ในตัวอย่างข้างต้น
PostsController
จะไม่ค้นหา layout ของ posts โดยอัตโนมัติ ถ้าคุณต้องการฟังก์ชันนี้คุณสามารถลบlayout "application"
จากApplicationController
หรือตั้งค่าเป็นnil
ในPostsController
ได้ยกเลิกการใช้
ActionController::UnknownAction
และใช้AbstractController::ActionNotFound
แทนยกเลิกการใช้
ActionController::DoubleRenderError
และใช้AbstractController::DoubleRenderError
แทนยกเลิกการใช้
method_missing
และใช้action_missing
แทนสำหรับการไม่พบการกระทำยกเลิกการใช้
ActionController#rescue_action
,ActionController#initialize_template_class
และActionController#assign_shortcuts
7.2 Action Dispatch
เพิ่ม
config.action_dispatch.default_charset
เพื่อกำหนดค่า charset เริ่มต้นสำหรับActionDispatch::Response
เพิ่ม middleware
ActionDispatch::RequestId
ที่จะทำให้ header X-Request-Id ที่ไม่ซ้ำกันสามารถใช้งานได้ในการตอบสนองและเปิดใช้งานเมธอดActionDispatch::Request#uuid
ซึ่งทำให้ง่ายต่อการติดตามคำขอจากจุดสุดท้ายในสแต็กและระบุคำขอแต่ละคำในบันทึกผสม เช่น SyslogMiddleware
ShowExceptions
ตอนนี้ยอมรับแอปพลิเคชันข้อยกเว้นที่รับผิดชอบในการแสดงข้อยกเว้นเมื่อแอปพลิเคชันล้มเหลว แอปพลิเคชันจะถูกเรียกใช้งานพร้อมกับข้อยกเว้นที่คัดลอกในenv["action_dispatch.exception"]
และPATH_INFO
ที่ถูกเขียนใหม่เป็นรหัสสถานะอนุญาตให้กำหนดการตอบสนองของการช่วยเหลือผ่าน railtie เช่น
config.action_dispatch.rescue_responses
7.2.1 การเลิกใช้งาน
- ยกเลิกการกำหนด charset เริ่มต้นที่ระดับคอนโทรลเลอร์ ให้ใช้
config.action_dispatch.default_charset
แทน
7.3 Action View
เพิ่มการสนับสนุน
button_tag
ในActionView::Helpers::FormBuilder
ซึ่งจะทำให้มีพฤติกรรมเริ่มต้นเหมือนกับsubmit_tag
<%= form_for @post do |f| %> <%= f.button %> <% end %>
ช่วยให้เมธอดเกี่ยวกับวันที่ยอมรับตัวเลือกใหม่
:use_two_digit_numbers => true
ซึ่งจะแสดงกล่องเลือกสำหรับเดือนและวันด้วยตัวเลขสองหลักโดยมีเลขศูนย์นำหน้าโดยไม่เปลี่ยนแปลงค่าที่เกี่ยวข้อง ตัวอย่างเช่น สามารถใช้งานได้สำหรับการแสดงวันที่แบบ ISO 8601 เช่น '2011-08-01'คุณสามารถระบุเนมสเปซสำหรับฟอร์มของคุณเพื่อให้แน่ใจว่า id attributes บนองค์ประกอบของฟอร์มไม่ซ้ำกัน แอตทริบิวต์เนมสเปซจะถูกเติมขีดล่างไว้กับ HTML id ที่สร้างขึ้น
<%= form_for(@offer, :namespace => 'namespace') do |f| %> <%= f.label :version, 'Version' %>: <%= f.text_field :version %> <% end %>
จำกัดจำนวนตัวเลือกสำหรับ
select_year
เป็น 1000 ตัวเลือก สามารถใช้ตัวเลือก:max_years_allowed
เพื่อกำหนดขีดจำกัดของคุณเองcontent_tag_for
และdiv_for
สามารถรับคอลเลกชันของเรคคอร์ดได้แล้ว และจะส่งค่าเรคคอร์ดเป็นอาร์กิวเมนต์แรกถ้าคุณตั้งค่าอาร์กิวเมนต์ที่รับไว้ในบล็อกของคุณ ดังนั้นไม่จำเป็นต้องทำดังนี้:@items.each do |item| content_tag_for(:li, item) do Title: <%= item.title %> end end
คุณสามารถทำดังนี้ได้:
content_tag_for(:li, @items) do |item| Title: <%= item.title %> end
เพิ่มเมธอดช่วย
font_path
ซึ่งคำนวณเส้นทางไปยังแอสเซ็ตฟอนต์ในpublic/fonts
7.3.1 การเลิกใช้งาน
- การส่ง formats หรือ handlers ไปยัง
render :template
และคล้ายๆ กัน เช่นrender :template => "foo.html.erb"
ถูกยกเลิก แทนที่คุณสามารถให้ :handlers และ :formats โดยตรงเป็นตัวเลือกได้ เช่นrender :template => "foo", :formats => [:html, :js], :handlers => :erb
7.4 Sprockets
- เพิ่มตัวเลือกการกำหนดค่า
config.assets.logger
เพื่อควบคุมการบันทึกของ Sprockets ตั้งค่าเป็นfalse
เพื่อปิดการบันทึก และเป็นnil
เพื่อใช้ค่าเริ่มต้นRails.logger
8 Active Record
คอลัมน์บูลีนที่มีค่า 'on' และ 'ON' จะถูกแปลงเป็น true
เมื่อเมธอด
timestamps
สร้างคอลัมน์created_at
และupdated_at
จะทำให้คอลัมน์เหล่านี้ไม่สามารถเป็นค่าว่างได้ตามค่าเริ่มต้นสร้าง
ActiveRecord::Relation#explain
สร้าง
ActiveRecord::Base.silence_auto_explain
ซึ่งช่วยให้ผู้ใช้สามารถปิดการใช้งาน EXPLAIN อัตโนมัติได้ในบล็อกสร้างการบันทึก EXPLAIN อัตโนมัติสำหรับคำสั่งคิวรี่ช้า พารามิเตอร์การกำหนดค่าใหม่
config.active_record.auto_explain_threshold_in_seconds
กำหนดว่าคิวรี่ใดจะถือว่าเป็นคิวรี่ช้า การตั้งค่าเป็น nil จะปิดการใช้งานคุณสมบัตินี้ เริ่มต้นคือ 0.5 ในโหมดการพัฒนา และ nil ในโหมดการทดสอบและการใช้งานจริง Rails 3.2 รองรับคุณสมบัตินี้ใน SQLite, MySQL (mysql2 adapter) และ PostgreSQLเพิ่ม
ActiveRecord::Base.store
เพื่อประกาศการเก็บค่า key/value แบบ single-column ที่เรียบง่ายclass User < ActiveRecord::Base store :settings, accessors: [ :color, :homepage ] end u = User.new(color: 'black', homepage: '37signals.com') u.color # Accessor stored attribute u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor
เพิ่มความสามารถในการรัน migrations เฉพาะส่วนที่กำหนด ซึ่งช่วยให้สามารถรัน migrations เฉพาะจากเอ็นจินที่กำหนดได้ (เช่นการย้อนกลับการเปลี่ยนแปลงจากเอ็นจินที่ต้องการลบออก)
rake db:migrate SCOPE=blog
Migrations ที่คัดลอกมาจากเอ็นจินจะมีขอบเขตที่ระบุด้วยชื่อของเอ็นจิน เช่น
01_create_posts.blog.rb
.สร้าง
ActiveRecord::Relation#pluck
เพื่อให้สามารถรับค่าคอลัมน์เป็นอาร์เรย์โดยตรงจากตารางในฐานข้อมูล ฟังก์ชันนี้ยังสามารถทำงานกับ attribute ที่ถูก serialize ได้Client.where(:active => true).pluck(:id) # SELECT id from clients where active = 1
สร้างเมธอดของ association ในโมดูลที่แยกออกมาเพื่อให้สามารถ override และสร้างคอมโพสิตได้ สำหรับคลาสที่ชื่อ MyModel โมดูลจะชื่อ
MyModel::GeneratedFeatureMethods
และถูก include เข้าไปในคลาสโมเดลทันทีหลังจากโมดูลgenerated_attributes_methods
ที่ถูกกำหนดใน Active Model เพื่อให้เมธอดของ association สามารถ override attribute methods ที่มีชื่อเดียวกันได้เพิ่ม
ActiveRecord::Relation#uniq
เพื่อสร้างคิวรี่ที่ไม่ซ้ำกันClient.select('DISTINCT name')
..สามารถเขียนได้เป็น:
Client.select(:name).uniq
นี้ยังช่วยให้สามารถย้อนกลับการไม่ซ้ำกันใน relation ได้:
Client.select(:name).uniq.uniq(false)
รองรับการเรียงลำดับด้วยดัชนีใน SQLite, MySQL และ PostgreSQL adapters
อนุญาตให้ใช้
:class_name
option สำหรับ associations ให้รับ symbol นอกจาก string นอกจากนี้ยังช่วยให้เข้าใจง่ายขึ้นสำหรับผู้เริ่มต้น และเป็นความสม่ำเสมอกับความจริงที่ options อื่น ๆ เช่น:foreign_key
อนุญาตให้ใช้ symbol หรือ stringhas_many :clients, :class_name => :Client # โปรดทราบว่าต้องใช้ตัวพิมพ์ใหญ่สำหรับ symbol
ในโหมดการพัฒนา,
db:drop
จะลบฐานข้อมูลทดสอบเพื่อให้สมมุติกับdb:create
การตรวจสอบความไม่ซ้ำกันที่ไม่สนใจตัวอักษรใน MySQL จะไม่เรียกใช้ LOWER เมื่อคอลัมน์ใช้ collation ที่ไม่สนใจตัวอักษร
Transactional fixtures จะเรียกใช้งาน connection ฐานข้อมูลที่ใช้งานอยู่ทั้งหมด คุณสามารถทดสอบโมเดลบน connection ที่แตกต่างกันได้โดยไม่ต้องปิด transactional fixtures
เพิ่ม
first_or_create
,first_or_create!
,first_or_initialize
เข้าสู่ Active Record เป็นวิธีการที่ดีกว่าเมธอดfind_or_create_by
ที่เก่าเพราะชัดเจนว่าอาร์กิวเมนต์ใดที่ใช้ในการค้นหาและอาร์กิวเมนต์ใดที่ใช้ในการสร้างUser.where(:first_name => "Scarlett").first_or_create!(:last_name => "Johansson")
เพิ่มเมธอด
with_lock
เข้าสู่ออบเจ็กต์ Active Record ซึ่งจะเริ่ม transaction, ล็อกออบเจ็กต์ (โดยเชื่อมต่อกับความไม่เชื่อมต่อ) และ yield ไปยังบล็อก ฟังก์ชันรับพารามิเตอร์หนึ่ง (ที่ไม่บังคับ) และส่งต่อไปยังlock!
นี้ทำให้เป็นไปได้ที่จะเขียนดังนี้:
class Order < ActiveRecord::Base def cancel! transaction do lock! # ... ตรรกะการยกเลิก end end end
เป็น:
class Order < ActiveRecord::Base def cancel! with_lock do # ... ตรรกะการยกเลิก end end end
8.1 การเลิกใช้
การปิดการเชื่อมต่ออัตโนมัติใน thread ถูกเลิกใช้งาน ตัวอย่างเช่นรหัสต่อไปนี้ถูกเลิกใช้งาน:
Thread.new { Post.find(1) }.join
ควรเปลี่ยนให้ปิดการเชื่อมต่อฐานข้อมูลที่สิ้นสุดของ thread:
Thread.new { Post.find(1) Post.connection.close }.join
เฉพาะผู้ที่สร้างเธรดในโค้ดแอปพลิเคชันของพวกเขาเท่านั้นที่ต้องกังวลเกี่ยวกับการเปลี่ยนแปลงนี้
เมธอด
set_table_name
,set_inheritance_column
,set_sequence_name
,set_primary_key
,set_locking_column
ถูกยกเลิกการใช้งานแล้ว ให้ใช้เมธอดการกำหนดค่าแทน ตัวอย่างเช่น แทนที่จะใช้set_table_name
ให้ใช้self.table_name=
class Project < ActiveRecord::Base self.table_name = "project" end
หรือกำหนด
self.table_name
เองclass Post < ActiveRecord::Base def self.table_name "special_" + super end end Post.table_name # => "special_posts"
9 Active Model
เพิ่ม
ActiveModel::Errors#added?
เพื่อตรวจสอบว่ามีข้อผิดพลาดที่ระบุไว้หรือไม่เพิ่มความสามารถในการกำหนดการตรวจสอบที่เข้มงวดด้วย
strict => true
ซึ่งจะเกิดข้อยกเว้นเสมอเมื่อการตรวจสอบล้มเหลวให้ mass_assignment_sanitizer เป็น API ที่ง่ายต่อการแทนที่พฤติกรรมของตัวกรอง รองรับทั้ง sanitizer แบบ :logger (ค่าเริ่มต้น) และ sanitizer แบบ :strict
9.1 การเลิกใช้งาน
เลิกใช้งาน
define_attr_method
ในActiveModel::AttributeMethods
เนื่องจากมีอยู่เพียงเพื่อสนับสนุนเมธอดเช่นset_table_name
ใน Active Record ซึ่งกำลังถูกเลิกใช้งานเลิกใช้งาน
Model.model_name.partial_path
และใช้model.to_partial_path
แทน
10 Active Resource
- การตอบสนองการเปลี่ยนเส้นทาง: การตอบสนอง 303 See Other และ 307 Temporary Redirect ตอนนี้มีพฤติกรรมเหมือนกับ 301 Moved Permanently และ 302 Found
11 Active Support
เพิ่ม
ActiveSupport:TaggedLogging
ซึ่งสามารถคลุมคลองคลาสLogger
มาตรฐานใดก็ได้เพื่อให้สามารถใช้แท็กได้Logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT)) Logger.tagged("BCX") { Logger.info "Stuff" } # Logs "[BCX] Stuff" Logger.tagged("BCX", "Jason") { Logger.info "Stuff" } # Logs "[BCX] [Jason] Stuff" Logger.tagged("BCX") { Logger.tagged("Jason") { Logger.info "Stuff" } } # Logs "[BCX] [Jason] Stuff"
เมธอด
beginning_of_week
ในDate
,Time
และDateTime
ยอมรับอาร์กิวเมนต์ที่เป็นตัวเลือกที่แสดงว่าสัปดาห์เริ่มต้นในวันใดActiveSupport::Notifications.subscribed
ให้การสมัครสมาชิกกับเหตุการณ์ขณะที่บล็อกทำงานกำหนดเมธอดใหม่
Module#qualified_const_defined?
,Module#qualified_const_get
และModule#qualified_const_set
ที่เป็นคล้ายกับเมธอดที่เกี่ยวข้องใน API มาตรฐาน แต่ยอมรับชื่อค่าคงที่ที่มีคุณสมบัติเพิ่ม
#deconstantize
ซึ่งเสริม#demodulize
ในการเปลี่ยนรูปแบบ นี้จะลบส่วนที่อยู่ทางขวาสุดในชื่อค่าคงที่ที่มีคุณสมบัติเพิ่ม
safe_constantize
ซึ่งจะทำให้เป็นค่าคงที่ตามสตริง แต่ถ้าค่าคงที่ (หรือส่วนหนึ่งของมัน) ไม่มีอยู่จะคืนค่าnil
แทนที่จะเกิดข้อยกเว้นActiveSupport::OrderedHash
ถูกทำเครื่องหมายว่าสามารถแยกออกมาได้เมื่อใช้Array#extract_options!
เพิ่ม
Array#prepend
เป็นตัวย่อสำหรับArray#unshift
และArray#append
เป็นตัวย่อสำหรับArray#<<
การกำหนดสตริงว่างสำหรับ Ruby 1.9 ถูกขยายให้รองรับช่องว่าง Unicode นอกจากนี้ใน Ruby 1.8 ช่องว่างที่เป็นไอโดกราฟิก U
3000
ถือว่าเป็นช่องว่างตัวเติมเข้าใจคำย่อ
เพิ่ม
Time#all_day
,Time#all_week
,Time#all_quarter
และTime#all_year
เป็นวิธีการสร้างช่วงEvent.where(:created_at => Time.now.all_week) Event.where(:created_at => Time.now.all_day)
เพิ่ม
instance_accessor: false
เป็นตัวเลือกให้กับClass#cattr_accessor
และฟังก์ชันที่เกี่ยวข้องActiveSupport::OrderedHash
ตอนนี้มีพฤติกรรมที่แตกต่างกันสำหรับ#each
และ#each_pair
เมื่อมีบล็อกที่รับพารามิเตอร์ของมันด้วย splatเพิ่ม
ActiveSupport::Cache::NullStore
เพื่อใช้ในการพัฒนาและทดสอบเอาออก
ActiveSupport::SecureRandom
และใช้SecureRandom
จากไลบรารีมาตรฐานแทน
11.1 การเลิกใช้งาน
ActiveSupport::Base64
เลิกใช้งานและใช้::Base64
แทนเลิกใช้งาน
ActiveSupport::Memoizable
และใช้รูปแบบการจดจำของ Ruby แทนModule#synchronize
เลิกใช้งานโดยไม่มีตัวเลือกทดแทน โปรดใช้ monitor จากไลบรารีมาตรฐานของ Ruby แทนเลิกใช้งาน
ActiveSupport::MessageEncryptor#encrypt
และActiveSupport::MessageEncryptor#decrypt
ActiveSupport::BufferedLogger#silence
ถูกยกเลิกการใช้งานแล้ว หากคุณต้องการปิดเสียงบันทึกสำหรับบล็อกที่ระบุ ให้เปลี่ยนระดับบันทึกสำหรับบล็อกนั้นActiveSupport::BufferedLogger#open_log
ถูกยกเลิกการใช้งานแล้ว วิธีนี้ไม่ควรเป็นสาธารณะในที่แรกพฤติกรรมของ
ActiveSupport::BufferedLogger
ในการสร้างไดเรกทอรีอัตโนมัติสำหรับไฟล์บันทึกของคุณถูกยกเลิกการใช้งานแล้ว โปรดตรวจสอบให้แน่ใจว่าคุณได้สร้างไดเรกทอรีสำหรับไฟล์บันทึกของคุณก่อนที่จะสร้างอินสแตนซ์ActiveSupport::BufferedLogger#auto_flushing
ถูกยกเลิกการใช้งานแล้ว คุณสามารถตั้งระดับการซิงค์บนไฟล์แฮนเดิลใต้ดัชนีได้ดังนี้ หรือปรับแต่งระบบไฟล์ของคุณ แคชของระบบไฟล์เป็นสิ่งที่ควบคุมการซิงค์f = File.open('foo.log', 'w') f.sync = true ActiveSupport::BufferedLogger.new f
ActiveSupport::BufferedLogger#flush
ถูกยกเลิกการใช้งานแล้ว ตั้งค่าการซิงค์บนไฟล์แฮนเดิลของคุณ หรือปรับแต่งระบบไฟล์ของคุณ
12 เครดิต
ดู รายชื่อผู้มีส่วนร่วมทั้งหมดใน Rails สำหรับผู้ที่ใช้เวลาหลายชั่วโมงในการสร้าง Rails เป็นเฟรมเวิร์กที่เสถียรและทนทาน ยินดีด้วยทุกคน
บันทึกการเปิดตัว Rails 3.2 รวบรวมโดย Vijay Dev
ข้อเสนอแนะ
คุณสามารถช่วยปรับปรุงคุณภาพของคู่มือนี้ได้
กรุณาช่วยเพิ่มเติมหากพบข้อผิดพลาดหรือข้อผิดพลาดทางความจริง เพื่อเริ่มต้นคุณสามารถอ่านส่วน การสนับสนุนเอกสาร ของเราได้
คุณอาจพบเนื้อหาที่ไม่สมบูรณ์หรือเนื้อหาที่ไม่ได้อัปเดต กรุณาเพิ่มเอกสารที่ขาดหายไปสำหรับเนื้อหาหลัก โปรดตรวจสอบ Edge Guides ก่อนเพื่อตรวจสอบ ว่าปัญหาได้รับการแก้ไขหรือไม่ในสาขาหลัก ตรวจสอบ คู่มือแนวทาง Ruby on Rails เพื่อดูรูปแบบและกฎเกณฑ์
หากคุณพบข้อผิดพลาดแต่ไม่สามารถแก้ไขได้เอง กรุณา เปิดปัญหา.
และสุดท้าย การสนทนาใด ๆ เกี่ยวกับ Ruby on Rails เอกสารยินดีต้อนรับที่สุดใน เว็บบอร์ดอย่างเป็นทางการของ Ruby on Rails.