1 การอัปเกรดไปยัง Rails 3.1
หากคุณกำลังอัปเกรดแอปพลิเคชันที่มีอยู่ ควรมีการทดสอบที่ดีก่อนที่จะเริ่มต้น คุณควรอัปเกรดไปยัง Rails 3 ก่อนหากคุณยังไม่ได้ทำ และตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณยังทำงานตามที่คาดหวังก่อนที่จะพยายามอัปเดตไปยัง Rails 3.1 จากนั้นให้ทำตามขั้นตอนต่อไปนี้:
1.1 Rails 3.1 ต้องการ Ruby 1.8.7 หรือสูงกว่า
Rails 3.1 ต้องการ Ruby 1.8.7 หรือสูงกว่า การสนับสนุนสำหรับรุ่น Ruby ก่อนหน้านี้ทั้งหมดถูกยกเลิกอย่างเป็นทางการและคุณควรอัปเกรดให้เร็วที่สุด Rails 3.1 ยังเข้ากันได้กับ Ruby 1.9.2
เคล็ดลับ: โปรดทราบว่า Ruby 1.8.7 p248 และ p249 มีข้อบกพร่องในการมาร์ชลิ่งที่ทำให้ระบบล้มเหลว แต่ Ruby Enterprise Edition ได้แก้ไขปัญหาเหล่านี้ตั้งแต่เวอร์ชัน 1.8.7-2010.02 สำหรับเวอร์ชัน 1.9 Ruby 1.9.1 ไม่สามารถใช้งานได้เพราะมีข้อบกพร่องที่รุนแรง ดังนั้นหากคุณต้องการใช้ 1.9.x ควรใช้เวอร์ชัน 1.9.2 เพื่อความราบรื่น
1.2 อัปเดตในแอปพลิเคชันของคุณ
การเปลี่ยนแปลงต่อไปนี้เหมาะสำหรับการอัปเกรดแอปพลิเคชันของคุณไปยัง Rails 3.1.3 เวอร์ชันล่าสุดของ Rails 3.1.x
1.2.1 Gemfile
ทำการเปลี่ยนแปลงต่อไปนี้ใน Gemfile
ของคุณ
gem 'rails', '= 3.1.3'
gem 'mysql2'
# จำเป็นสำหรับ asset pipeline ใหม่
group :assets do
gem 'sass-rails', "~> 3.1.5"
gem 'coffee-rails', "~> 3.1.1"
gem 'uglifier', ">= 1.0.3"
end
# jQuery เป็นไลบรารี JavaScript เริ่มต้นใน Rails 3.1
gem 'jquery-rails'
1.2.2 config/application.rb
Asset pipeline ต้องการการเพิ่มต่อไปนี้:
config.assets.enabled = true config.assets.version = '1.0'
หากแอปพลิเคชันของคุณใช้เส้นทาง "/assets" สำหรับทรัพยากร คุณอาจต้องเปลี่ยนคำนำหน้าที่ใช้สำหรับทรัพยากรเพื่อหลีกเลี่ยงความขัดแย้ง:
# ค่าเริ่มต้นคือ '/assets' config.assets.prefix = '/asset-files'
1.2.3 config/environments/development.rb
ลบการตั้งค่า RJS
config.action_view.debug_rjs = true
.เพิ่มต่อไปนี้หากคุณเปิดใช้งาน asset pipeline.
# อย่าบีบอัดทรัพยากร config.assets.compress = false # ขยายบรรทัดที่โหลดทรัพยากร config.assets.debug = true
1.2.4 config/environments/production.rb
อีกครั้ง, การเปลี่ยนแปลงส่วนใหญ่ด้านล่างเป็นสำหรับ asset pipeline คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ใน Asset Pipeline ได้
# บีบอัด JavaScripts และ CSS config.assets.compress = true # ไม่ต้องสลับกลับไปที่ asset pipeline หากไม่พบทรัพยากรที่ถูกสร้างไว้ล่วงหน้า config.assets.compile = false # สร้างเลขรหัสสำหรับ URL ของทรัพยากร config.assets.digest = true # ค่าเริ่มต้นคือ Rails.root.join("public/assets") # config.assets.manifest = YOUR_PATH # ทำการสร้างทรัพยากรเพิ่มเติม (application.js, application.css, และทรัพยากรที่ไม่ใช่ JS/CSS ทั้งหมดถูกเพิ่มไว้แล้ว) # config.assets.precompile `= %w( admin.js admin.css ) # บังคับให้เข้าถึงแอปผ่าน SSL, ใช้ Strict-Transport-Security, และใช้ secure cookies. # config.force_ssl = true
1.2.5 config/environments/test.rb
# กำหนดค่าเซิร์ฟเวอร์ทรัพยากรแบบสถิตในการทดสอบพร้อมกับ Cache-Control เพื่อเพิ่มประสิทธิภาพ
config.serve_static_assets = true
config.static_cache_control = "public, max-age=3600"
1.2.6 config/initializers/wrap_parameters.rb
เพิ่มไฟล์นี้พร้อมเนื้อหาดังต่อไปนี้หากคุณต้องการแพ็คเกจพารามิเตอร์เข้ากับแฮชซ้อนกัน ซึ่งมีการเปิดใช้งานโดยค่าเริ่มต้นในแอปพลิเคชันใหม่
# ตรวจสอบให้แน่ใจว่าคุณเริ่มเซิร์ฟเวอร์ของคุณใหม่เมื่อคุณแก้ไขไฟล์นี้ # ไฟล์นี้มีการตั้งค่าสำหรับ ActionController::ParamsWrapper ซึ่ง # เปิดใช้งานโดยค่าเริ่มต้น # เปิดใช้งานการแพ็คเกจสำหรับ JSON คุณสามารถปิดใช้งานได้โดยการตั้งค่า :format เป็นอาร์เรย์ที่ว่างเปล่า ActiveSupport.on_load(:action_controller) do wrap_parameters :format => [:json] end # ปิดใช้งานองค์ประกอบรูทใน JSON โดยค่าเริ่มต้น ActiveSupport.on_load(:active_record) do self.include_root_in_json = false end
1.2.7 ลบตัวเลือก :cache และ :concat ในการอ้างอิงเฮลเปอร์ของแอสเซ็ทในวิว
- ด้วย Asset Pipeline ตัวเลือก :cache และ :concat ไม่ได้ใช้งานอีกต่อไป ลบตัวเลือกเหล่านี้ออกจากวิวของคุณ
2 การสร้างแอปพลิเคชัน Rails 3.1
# คุณควรมี 'rails' RubyGem ติดตั้งแล้ว
$ rails new myapp
$ cd myapp
2.1 การเก็บเอาไว้ในแฟ้ม
Rails ใช้ Gemfile
ในรากแอปพลิเคชันเพื่อกำหนดแพ็คเกจที่คุณต้องการสำหรับแอปพลิเคชันของคุณให้เริ่มต้น ไฟล์ Gemfile
นี้จะถูกประมวลผลโดยแพ็คเกจ Bundler ซึ่งจะติดตั้งแพ็คเกจทั้งหมดที่คุณต้องการ มันยังสามารถติดตั้งแพ็คเกจทั้งหมดไว้ในแอปพลิเคชันของคุณเพื่อไม่ต้องพึ่งพาแพ็คเกจของระบบ
ข้อมูลเพิ่มเติม: - หน้าหลัก bundler
2.2 อาศัยอยู่บนเส้นขอบ
Bundler
และ Gemfile
ทำให้การแช่แข็งแอปพลิเคชัน Rails ของคุณง่ายเหมือนพาย ด้วยคำสั่ง bundle
ที่มีไว้เฉพาะการแช่แข็ง หากคุณต้องการแพ็คเกจโดยตรงจากที่เก็บ Git คุณสามารถส่งผ่านตัวเลือก --edge
:
$ rails new myapp --edge
หากคุณมีการเช็คเอาต์ท้องถิ่นของเก็บรักษาของ Rails และต้องการสร้างแอปพลิเคชันโดยใช้นั้นคุณสามารถส่งผ่านตัวเลือก --dev
:
$ ruby /path/to/rails/railties/bin/rails new myapp --dev
3 การเปลี่ยนแปลงทางสถาปัตยกรรมของ Rails
3.1 พายไลน์ทรัพยากร
การเปลี่ยนแปลงหลักใน Rails 3.1 คือพายไลน์ทรัพยากร มันทำให้ CSS และ JavaScript เป็นโค้ดพลังงานแรกชั้นและเปิดให้ใช้งานอย่างถูกต้อง รวมถึงการใช้งานในปลั๊กอินและเอนจิน
พายไลน์ทรัพยากรถูกขับเคลื่อนด้วย Sprockets และอธิบายในคู่มือ พายไลน์ทรัพยากร
3.2 HTTP Streaming
HTTP Streaming เป็นการเปลี่ยนแปลงอีกอย่างหนึ่งที่ใหม่ใน Rails 3.1 นี้ สิ่งนี้ช่วยให้เบราว์เซอร์ดาวน์โหลดสไตล์ชีตและไฟล์ JavaScript ของคุณในขณะที่เซิร์ฟเวอร์กำลังสร้างการตอบสนอง สิ่งนี้ต้องการ Ruby 1.9.2 เป็นตัวเลือกและต้องการการสนับสนุนจากเว็บเซิร์ฟเวอร์เช่นกัน แต่คู่สุดยอดของ NGINX และ Unicorn พร้อมที่จะใช้ประโยชน์จากนี้
3.3 ไลบรารี JS เริ่มต้นคือ jQuery
jQuery เป็นไลบรารี JavaScript เริ่มต้นที่มาพร้อมกับ Rails 3.1 แต่หากคุณใช้ Prototype มันง่ายที่จะสลับ
$ rails new myapp -j prototype
3.4 แผนที่ Identity
Active Record มีแผนที่ Identity ใน Rails 3.1 แผนที่ Identity จะเก็บบันทึกที่เรียกใช้แล้วไว้และคืนค่าออบเจกต์ที่เกี่ยวข้องกับบันทึกเมื่อเข้าถึงอีกครั้ง แผนที่ Identity ถูกสร้างขึ้นตามคำขอและถูกล้างเมื่อคำขอเสร็จสมบูรณ์
Rails 3.1 มาพร้อมกับแผนที่ Identity ที่ปิดใช้งานโดยค่าเริ่มต้น
4 Railties
jQuery เป็นไลบรารี JavaScript เริ่มต้นใหม่
jQuery และ Prototype ไม่ได้เป็นแพ็คเกจและจะให้จากนี้ไปโดยแพ็คเกจ
jquery-rails
และprototype-rails
ตัวสร้างแอปพลิเคชันยอมรับตัวเลือก
-j
ซึ่งสามารถเป็นสตริงอะไรก็ได้ ถ้าส่ง "foo" จะเพิ่ม gem "foo-rails" เข้าไปในGemfile
และแอปพลิเคชันจะต้องใช้ "foo" และ "foo_ujs" ในการจัดการ JavaScript ขณะนี้มีเพียง "prototype-rails" และ "jquery-rails" เท่านั้นที่มีและให้ไฟล์เหล่านี้ผ่านทาง asset pipelineการสร้างแอปพลิเคชันหรือปลั๊กอินจะเรียกใช้
bundle install
ถ้าไม่ระบุ--skip-gemfile
หรือ--skip-bundle
ตัวสร้างคอนโทรลเลอร์และเรซอร์สจะสร้าง asset stubs โดยอัตโนมัติ (สามารถปิดการใช้งานได้ด้วย
--skip-assets
) เหล่า stubs เหล่านี้จะใช้ CoffeeScript และ Sass ถ้าไลบรารีเหล่านี้มีอยู่ตัวสร้าง Scaffold และ app จะใช้รูปแบบแฮชสไตล์ Ruby 1.9 เมื่อทำงานบน Ruby 1.9 สามารถสร้างแฮชสไตล์เก่าได้โดยใช้
--old-style-hash
ตัวสร้างคอนโทรลเลอร์ Scaffold จะสร้างบล็อกรูปแบบสำหรับ JSON แทน XML
การบันทึก Active Record จะถูกนำไปยัง STDOUT และแสดงในคอนโซล
เพิ่มการกำหนดค่า
config.force_ssl
ซึ่งโหลด middlewareRack::SSL
และบังคับให้คำขอทั้งหมดอยู่ในโปรโตคอล HTTPSเพิ่มคำสั่ง
rails plugin new
ซึ่งสร้างปลั๊กอิน Rails พร้อมกับ gemspec, tests และ dummy application สำหรับการทดสอบเพิ่ม
Rack::Etag
และRack::ConditionalGet
เข้าไปใน default middleware stackเพิ่ม
Rack::Cache
เข้าไปใน default middleware stackEngines ได้รับการอัปเดตใหญ่ - คุณสามารถ mount ได้ที่เส้นทางใดก็ได้, เปิดใช้งาน assets, รันตัวสร้าง เป็นต้น
5 Action Pack
5.1 Action Controller
จะแสดงคำเตือนถ้าไม่สามารถตรวจสอบความถูกต้องของ CSRF token authenticity ได้
ระบุ
force_ssl
ในคอนโทรลเลอร์เพื่อบังคับเบราว์เซอร์ให้ถ่ายโอนข้อมูลผ่านโปรโตคอล HTTPS บนคอนโทรลเลอร์นั้นๆ สามารถจำกัดได้เฉพาะ action ที่ระบุได้โดยใช้:only
หรือ:except
พารามิเตอร์สตริงคิวรี่ที่ระบุใน
config.filter_parameters
จะถูกกรองออกจากเส้นทางคำขอในบันทึกพารามิเตอร์ URL ที่ส่งค่า
nil
สำหรับto_param
จะถูกลบออกจากคิวรี่สตริงเพิ่ม
ActionController::ParamsWrapper
เพื่อห่อพารามิเตอร์เป็นแฮชที่ซ้อนกัน และจะถูกเปิดใช้งานสำหรับ JSON request ในแอปพลิเคชันใหม่ตามค่าเริ่มต้น สามารถปรับแต่งได้ในconfig/initializers/wrap_parameters.rb
เพิ่ม
config.action_controller.include_all_helpers
โดยค่าเริ่มต้นhelper :all
จะถูกทำในActionController::Base
ซึ่งรวมเข้ากับ helpers ทั้งหมดโดยค่าเริ่มต้น การตั้งค่าinclude_all_helpers
เป็นfalse
จะทำให้รวมเข้ากับ application_helper เท่านั้นและ helper ที่สอดคล้องกับคอนโทรลเลอร์ (เช่น foo_helper สำหรับ foo_controller)url_for
และ named URL helpers ตอนนี้ยอมรับ:subdomain
และ:domain
เป็นตัวเลือกเพิ่ม
Base.http_basic_authenticate_with
เพื่อทำการตรวจสอบความถูกต้องของการรับรองตัวตนแบบ http basic ด้วยการเรียกใช้เมธอดคลาสเดียวclass PostsController < ApplicationController USER_NAME, PASSWORD = "dhh", "secret" before_filter :authenticate, :except => [ :index ] def index render :text => "Everyone can see me!" end def edit render :text => "I'm only accessible if you know the password" end private def authenticate authenticate_or_request_with_http_basic do |user_name, password| user_name == USER_NAME && password == PASSWORD end end end
..สามารถเขียนเป็น
class PostsController < ApplicationController http_basic_authenticate_with :name => "dhh", :password => "secret", :except => :index def index render :text => "Everyone can see me!" end def edit render :text => "I'm only accessible if you know the password" end end
เพิ่มการสนับสนุนการสตรีมสตรีม คุณสามารถเปิดใช้งานได้ด้วย:
class PostsController < ActionController::Base stream end
คุณสามารถจำกัดได้เฉพาะบางแอ็คชันโดยใช้
:only
หรือ:except
โปรดอ่านเอกสารที่ActionController::Streaming
สำหรับข้อมูลเพิ่มเติมเมธอดเส้นทางการเปลี่ยนเส้นทางตอนนี้ยังยอมรับแฮชของตัวเลือกเป็นค่าเริ่มต้น ซึ่งจะเปลี่ยนเฉพาะส่วนที่เกี่ยวข้องกับ URL หรือวัตถุที่ตอบสนองกับการเรียกใช้งาน ทำให้สามารถใช้งานการเปลี่ยนเส้นทางได้อีกครั้ง
5.2 Action Dispatch
config.action_dispatch.x_sendfile_header
ตอนนี้มีค่าเริ่มต้นเป็นnil
และconfig/environments/production.rb
ไม่ตั้งค่าใด ๆ ให้กับมัน ซึ่งทำให้เซิร์ฟเวอร์สามารถตั้งค่าได้ผ่านX-Sendfile-Type
ActionDispatch::MiddlewareStack
ตอนนี้ใช้การสร้างคลาสแบบคอมโพสิชันแทนการสืบทอดแบบอาร์เรย์เพิ่ม
ActionDispatch::Request.ignore_accept_header
เพื่อละเว้นส่วนหัวการยอมรับเพิ่ม
Rack::Cache
เข้าไปในสแต็กเริ่มต้นย้ายความรับผิดชอบของ etag จาก
ActionDispatch::Response
ไปยังสแต็กมิดเดิลแวร์พึ่งพากับ API การเก็บรักษาเซสชันของ
Rack::Session
เพื่อให้เข้ากันได้มากขึ้นในโลกของ Ruby ซึ่งเป็นการเปลี่ยนแปลงที่ไม่สามารถทำได้ย้อนกลับ เนื่องจากRack::Session
คาดหวังให้#get_session
ยอมรับอาร์กิวเมนต์สี่ตัวและต้องการ#destroy_session
แทนที่จะใช้งานเพียง#destroy
การค้นหาเทมเพลตตอนนี้ค้นหาไปในสายการสืบทอดไกลกว่าเดิม
5.3 Action View
เพิ่มตัวเลือก
:authenticity_token
ให้กับform_tag
เพื่อการจัดการที่กำหนดเองหรือการละเว้นโทเค็นโดยการส่ง:authenticity_token => false
สร้าง
ActionView::Renderer
และระบุ API สำหรับActionView::Context
การเปลี่ยนแปลงใน
SafeBuffer
ที่เกิดขึ้นในที่นั่นถูกห้ามใน Rails 3.1เพิ่มตัวช่วย
button_tag
สำหรับ HTML5file_field
จะเพิ่ม:multipart => true
ให้กับฟอร์มที่ครอบอยู่โดยอัตโนมัติเพิ่มวิธีที่สะดวกในการสร้างแอตทริบิวต์
data-*
ในตัวช่วยแท็กจากแฮช:data
ของตัวเลือก:tag("div", :data => {:name => 'Stephen', :city_state => %w(Chicago IL)}) # => <div data-name="Stephen" data-city-state="["Chicago","IL"]" />
คีย์จะถูกแยกเป็นขีดกลาง ค่าจะถูกเข้ารหัสเป็น JSON ยกเว้นสตริงและสัญลักษณ์
csrf_meta_tag
ถูกเปลี่ยนชื่อเป็นcsrf_meta_tags
และตั้งชื่อเลียนแบบcsrf_meta_tag
เพื่อความเข้ากันได้ย้อนกลับAPI การจัดการเทมเพลตเก่าถูกยกเลิกและ API ใหม่ต้องการเพียงเทมเพลตแฮนเดอร์ที่ตอบสนองกับการเรียกใช้งาน
rhtml และ rxml ถูกลบออกเป็นตัวจัดการเทมเพลต
config.action_view.cache_template_loading
ถูกนำกลับมาซึ่งช่วยให้สามารถตัดสินใจว่าเทมเพลตควรถูกเก็บไว้ในแคชหรือไม่ช่วยให้
FormHelper#form_for
สามารถระบุ:method
เป็นตัวเลือกโดยตรงแทนที่จะผ่าน:html
ซึ่งเป็นแฮชform_for(@post, remote: true, method: :delete)
แทนที่จะเป็นform_for(@post, remote: true, html: { method: :delete })
ให้
JavaScriptHelper#j()
เป็นตัวย่อของJavaScriptHelper#escape_javascript()
ซึ่งเป็นการแทนที่เมธอดObject#j()
ที่ JSON gem เพิ่มในเทมเพลตโดยใช้ JavaScriptHelperอนุญาตให้ใช้รูปแบบ AM/PM ในตัวเลือกเลือกวันที่และเวลา
auto_link
ถูกลบออกจาก Rails และถูกแยกออกเป็น rails_autolink gem
6 Active Record
เพิ่มเมธอดคลาส
pluralize_table_names
เพื่อทำให้เปลี่ยนชื่อตารางของแต่ละโมเดลเป็นรูปพหูพจน์/เอกพจน์ ก่อนหน้านี้สามารถตั้งค่าได้ทั้งระบบสำหรับโมเดลทั้งหมดผ่านActiveRecord::Base.pluralize_table_names
class User < ActiveRecord::Base self.pluralize_table_names = false end
เพิ่มการตั้งค่าแบบบล็อกของแอตทริบิวต์สำหรับสัมพันธ์แบบเดี่ยว บล็อกจะถูกเรียกหลังจากตัวอินสแตนซ์ถูกเริ่มต้น
class User < ActiveRecord::Base has_one :account end user.build_account{ |a| a.credit_limit = 100.0 }
เพิ่ม
ActiveRecord::Base.attribute_names
เพื่อให้ส่งคืนรายการชื่อแอตทริบิวต์ ซึ่งจะส่งคืนอาร์เรย์ว่างหากโมเดลเป็นแบบสรุปหรือตารางไม่มีอยู่CSV Fixtures ถูกยกเลิกและจะถูกลบออกใน Rails 3.2.0
ActiveRecord#new
,ActiveRecord#create
และActiveRecord#update_attributes
สามารถรับแอตทริบิวต์เพิ่มเติมในรูปแบบของแฮชเป็นตัวเลือกที่ช่วยให้คุณสามารถระบุบทบาทที่จะใช้เมื่อกำหนดแอตทริบิวต์ ซึ่งสร้างขึ้นบนความสามารถใหม่ในการมอบหมายแบบมวลส่วนของ Active Model:class Post < ActiveRecord::Base attr_accessible :title attr_accessible :title, :published_at, :as => :admin end Post.new(params[:post], :as => :admin)
default_scope
สามารถรับบล็อก แลมบ์ดา หรืออ็อบเจ็กต์อื่น ๆ ที่ตอบสนองกับการเรียกใช้งานที่เกิดขึ้นในภายหลังDefault scopes ถูกประเมินในจุดสุดท้ายที่เป็นไปได้เพื่อหลีกเลี่ยงปัญหาที่จะสร้างขอบเขตที่จะมีขอบเขตเริ่มต้นอยู่ซึ่งจะเป็นไปไม่ได้ที่จะกำจัดได้ผ่าน Model.unscoped
อแดปเตอร์ PostgreSQL เฉพาะรองรับเวอร์ชัน PostgreSQL 8.2 และสูงกว่า
ConnectionManagement
middleware ถูกเปลี่ยนแปลงเพื่อทำความสะอาดเพิ่มเติมในพูลการเชื่อมต่อหลังจาก rack body ถูกส่งออกเพิ่มเมธอด
update_column
ใน Active Record วิธีใหม่นี้จะอัปเดตแอตทริบิวต์ที่กำหนดให้กับออบเจ็กต์โดยข้ามการตรวจสอบและการเรียกใช้งานตัวช่วย แนะนำให้ใช้update_attributes
หรือupdate_attribute
ยกเว้นกรณีที่แน่ใจว่าคุณไม่ต้องการทำใด ๆ จากการเรียกใช้งานตัวช่วย รวมถึงการแก้ไขคอลัมน์updated_at
ไม่ควรเรียกใช้กับเร็คคอร์ดใหม่ความสัมพันธ์ที่มีตัวเลือก
:through
สามารถใช้ความสัมพันธ์ใด ๆ เป็นตัวเลือกthrough
หรือsource
ได้ รวมถึงความสัมพันธ์อื่น ๆ ที่มีตัวเลือก:through
และความสัมพันธ์has_and_belongs_to_many
การกำหนดค่าสำหรับการเชื่อมต่อฐานข้อมูลปัจจุบันสามารถเข้าถึงได้ผ่าน
ActiveRecord::Base.connection_config
ลบ limits และ offsets จากคำสั่ง COUNT หากไม่ได้ระบุทั้งสอง
People.limit(1).count # => 'SELECT COUNT(*) FROM people' People.offset(1).count # => 'SELECT COUNT(*) FROM people' People.limit(1).offset(1).count # => 'SELECT COUNT(*) FROM people LIMIT 1 OFFSET 1'
ActiveRecord::Associations::AssociationProxy
ถูกแยกออกเป็นสองส่วน มีคลาสAssociation
(และคลาสย่อย) ที่รับผิดชอบในการดำเนินการกับความสัมพันธ์ และมีตัวครอบบางส่วนที่เรียกว่าCollectionProxy
ซึ่งเป็นตัวครอบที่บางส่วนสำหรับความสัมพันธ์ของคอลเลกชัน สิ่งนี้ช่วยป้องกันการปนเปื้อนของเนมสเปซ แยกประเภทงาน และช่วยให้สามารถทำการระบบการเรียงลำดับเพิ่มเติมได้ความสัมพันธ์แบบเอกเทียบเท่ากัน (
has_one
,belongs_to
) ไม่มีตัวครอบและเพียงแค่ส่งคืนเรคคอร์ดที่เกี่ยวข้องหรือnil
เท่านั้น นั่นหมายความว่าคุณไม่ควรใช้เมธอดที่ไม่ได้รับการเอกสารอย่างbob.mother.create
- ให้ใช้bob.create_mother
แทนรองรับตัวเลือก
:dependent
ในความสัมพันธ์has_many :through
ด้วย ด้วยเหตุผลทางประวัติศาสตร์และปฏิบัติ การลบเป็นวิธีการลบเริ่มต้นที่ใช้กับassociation.delete(*records)
แม้ว่าวิธีการเริ่มต้นจะเป็น:nullify
สำหรับ has_many ทั่วไป นอกจากนี้ สิ่งนี้ทำงานได้เฉพาะเมื่อการสะท้อนแหล่งที่มาเป็น belongs_to เท่านั้น สำหรับสถานการณ์อื่น ๆ คุณควรแก้ไขความสัมพันธ์ผ่านทางการสร้างพฤติกรรมของ
association.destroy
สำหรับhas_and_belongs_to_many
และhas_many :through
ถูกเปลี่ยนแปลง ตั้งแต่ตอนนี้ไปเป็นต้นไป 'destroy' หรือ 'delete' ในความสัมพันธ์จะถูกตีความว่า 'กำจัดลิงก์' ไม่ (จำเป็นต้อง) 'กำจัดเรคคอร์ดที่เกี่ยวข้อง'ก่อนหน้านี้
has_and_belongs_to_many.destroy(*records)
จะทำลายเรคคอร์ดเอง แต่จะไม่ลบเรคคอร์ดในตารางเชื่อมต่อ ตอนนี้จะลบเรคคอร์ดในตารางเชื่อมต่อก่อนหน้านี้
has_many_through.destroy(*records)
จะทำลายเรคคอร์ดเองและเรคคอร์ดในตารางเชื่อมโยง [หมายเหตุ: ไม่ใช่ทุกเวอร์ชัน; เวอร์ชันก่อนหน้าของ Rails เฉพาะลบเรคคอร์ดเองเท่านั้น] ตอนนี้มันจะทำลายเฉพาะเรคคอร์ดในตารางเชื่อมโยงเท่านั้นโปรดทราบว่าการเปลี่ยนแปลงนี้เป็นการเข้ากันได้ย้อนกลับได้ในระดับหนึ่ง แต่ไม่มีวิธี 'เลิกใช้' ก่อนเปลี่ยนแปลง การเปลี่ยนแปลงนี้ถูกดำเนินการเพื่อให้มีความสอดคล้องกับความหมายของ 'ทำลาย' หรือ 'ลบ' ในประเภทการเชื่อมโยงที่แตกต่างกัน หากคุณต้องการทำลายเรคคอร์ดเอง คุณสามารถทำได้โดยใช้
records.association.each(&:destroy)
.เพิ่มตัวเลือก
:bulk => true
ในchange_table
เพื่อทำให้การเปลี่ยนแปลง schema ทั้งหมดที่กำหนดในบล็อกใช้คำสั่ง ALTER เดียวchange_table(:users, :bulk => true) do |t| t.string :company_name t.change :birthdate, :datetime end
ลบการสนับสนุนในการเข้าถึงแอตทริบิวต์บนตารางเชื่อมโยง
has_and_belongs_to_many
ต้องใช้has_many :through
แทนเพิ่มเมธอด
create_association!
สำหรับการเชื่อมโยงhas_one
และbelongs_to
การเคลื่อนย้ายตอนนี้สามารถย้อนกลับได้ ซึ่งหมายความว่า Rails จะคิดวิธีที่จะย้อนกลับการเคลื่อนย้ายของคุณ ในการใช้การเคลื่อนย้ายที่สามารถย้อนกลับได้ เพียงแค่กำหนดเมธอด
change
class MyMigration < ActiveRecord::Migration def change create_table(:horses) do |t| t.column :content, :text t.column :remind_at, :datetime end end end
บางสิ่งบางอย่างไม่สามารถย้อนกลับได้อัตโนมัติ หากคุณรู้วิธีการย้อนกลับสิ่งเหล่านั้น คุณควรกำหนด
up
และdown
ในการเคลื่อนย้ายของคุณ หากคุณกำหนดสิ่งใดสิ่งหนึ่งในการเปลี่ยนแปลงที่ไม่สามารถย้อนกลับได้ จะเกิดข้อยกเว้นIrreversibleMigration
เมื่อกำลังย้อนกลับการเคลื่อนย้ายใช้เมธอดของอินสแตนซ์แทนเมธอดของคลาส:
class FooMigration < ActiveRecord::Migration def up # ไม่ใช่ self.up # ... end end
ไฟล์การเคลื่อนย้ายที่สร้างจากโมเดลและเจเนอเรเตอร์การเคลื่อนย้ายสร้างใช้เมธอดการเคลื่อนย้ายที่สามารถย้อนกลับได้
change
แทนเมธอดup
และdown
ทั่วไปลบการสนับสนุนในการตั้งค่าเงื่อนไข SQL แบบสตริงบนการเชื่อมโยง แทนที่ควรใช้ proc
has_many :things, :conditions => 'foo = #{bar}' # ก่อนหน้า has_many :things, :conditions => proc { "foo = #{bar}" } # ตอนนี้
ภายใน proc
self
คือออบเจ็กต์ที่เป็นเจ้าของของการเชื่อมโยง ยกเว้นถ้าคุณกำลังโหลดการเชื่อมโยงอย่างรวดเร็วself
คือคลาสที่การเชื่อมโยงอยู่ภายในคุณสามารถใช้เงื่อนไข "ปกติ" ใน proc ดังนั้นตัวอย่างต่อไปนี้จะทำงานได้เช่นกัน:
has_many :things, :conditions => proc { ["foo = ?", bar] }
ก่อนหน้านี้
:insert_sql
และ:delete_sql
บนการเชื่อมโยงhas_and_belongs_to_many
อนุญาตให้เรียกใช้ 'record' เพื่อรับเรคคอร์ดที่กำลังถูกแทรกหรือลบ ตอนนี้มันถูกส่งผ่านเป็นอาร์กิวเมนต์ให้กับ procเพิ่ม
ActiveRecord::Base#has_secure_password
(ผ่านActiveModel::SecurePassword
) เพื่อแยกการใช้รหัสผ่านที่ง่ายด้วยการเข้ารหัสและการเก็บเกี่ยวกับ BCrypt# โครงสร้าง: User(name:string, password_digest:string, password_salt:string) class User < ActiveRecord::Base has_secure_password end
เมื่อสร้างโมเดล
add_index
ถูกเพิ่มโดยค่าเริ่มต้นสำหรับคอลัมน์belongs_to
หรือreferences
การตั้งค่า id ของวัตถุ
belongs_to
จะอัปเดตการอ้างอิงไปยังวัตถุการเข้าใช้งาน
ActiveRecord::Base#dup
และActiveRecord::Base#clone
มีการเปลี่ยนแปลงในลักษณะที่ใกล้เคียงกับคำสั่ง dup และ clone ของ Ruby ปกติเรียกใช้
ActiveRecord::Base#clone
จะทำให้ได้รับการคัดลอกที่เป็น shallow copy ของเรคคอร์ด รวมถึงการคัดลอกสถานะที่ถูกแช่แข็ง ไม่มีการเรียกใช้ callbackเรียกใช้
ActiveRecord::Base#dup
จะทำการคัดลอกเรคคอร์ด รวมถึงการเรียกใช้ after initialize hooks สถานะที่ถูกแช่แข็งจะไม่ถูกคัดลอก และการเชื่อมต่อทั้งหมดจะถูกล้าง รายการที่ถูกคัดลอกจะส่งคืนค่าtrue
สำหรับnew_record?
มีฟิลด์ id เป็นnil
และสามารถบันทึกได้แคชคิวรี่ทำงานกับ prepared statements ตอนนี้ ไม่จำเป็นต้องเปลี่ยนแปลงในแอปพลิเคชัน
7 Active Model
attr_accessible
ยอมรับตัวเลือก:as
เพื่อระบุบทบาทInclusionValidator
,ExclusionValidator
, และFormatValidator
ตอนนี้ยอมรับตัวเลือกที่อาจเป็น proc, lambda, หรืออะไรก็ตามที่ตอบสนองกับcall
ตัวเลือกนี้จะถูกเรียกใช้งานกับเรคคอร์ดปัจจุบันเป็นอาร์กิวเมนต์และส่งคืนวัตถุที่ตอบสนองกับinclude?
สำหรับInclusionValidator
และExclusionValidator
และส่งคืนวัตถุประเภท regular expression สำหรับFormatValidator
เพิ่ม
ActiveModel::SecurePassword
เพื่อแยกการใช้รหัสผ่านที่ง่ายดายด้วยการเข้ารหัสและเก็บเกี่ยวกับ BCryptActiveModel::AttributeMethods
อนุญาตให้กำหนดแอตทริบิวต์ตามความต้องการเพิ่มการสนับสนุนในการเปิดใช้งานและปิดใช้งาน observers ได้อย่างเลือกที่ต้องการ
ไม่สนับสนุนการค้นหาชื่อเนมสเปซแบบอื่นแล้ว
8 Active Resource
รูปแบบเริ่มต้นถูกเปลี่ยนเป็น JSON สำหรับคำขอทั้งหมด หากคุณต้องการใช้ XML ต่อไปคุณจะต้องตั้งค่า
self.format = :xml
ในคลาส ตัวอย่างเช่นclass User < ActiveResource::Base self.format = :xml end
9 Active Support
ActiveSupport::Dependencies
ตอนนี้เรียกใช้NameError
หากพบค่าคงที่ที่มีอยู่ในload_missing_constant
เพิ่มเมธอดรายงานใหม่
Kernel#quietly
ซึ่งทำให้เงียบลงทั้งSTDOUT
และSTDERR
เพิ่ม
String#inquiry
เป็นเมธอดสะดวกสำหรับแปลงสตริงเป็นวัตถุStringInquirer
เพิ่ม
Object#in?
เพื่อทดสอบว่าวัตถุหนึ่งอยู่ในวัตถุอื่นหรือไม่กลยุทธ์
LocalCache
เป็นคลาส middleware แท้จริงและไม่ใช่คลาสอนูมิเนียสแบบไม่มีชื่ออีกต่อไปมีการแนะนำ
ActiveSupport::Dependencies::ClassCache
คลาสเพื่อเก็บอ้างอิงไว้สำหรับคลาสที่สามารถโหลดใหม่ได้ActiveSupport::Dependencies::Reference
ได้รับการรีแฟคเตอร์เพื่อใช้ประโยชน์จากClassCache
ใหม่Backports
Range#cover?
เป็นนามแฝงสำหรับRange#include?
ใน Ruby 1.8เพิ่ม
weeks_ago
และprev_week
สำหรับ Date/DateTime/Timeเพิ่ม
before_remove_const
callback ให้กับActiveSupport::Dependencies.remove_unloadable_constants!
การเลิกใช้:
ActiveSupport::SecureRandom
ถูกเลิกใช้แล้วและแนะนำให้ใช้SecureRandom
จากไลบรารีมาตรฐานของ Ruby
10 เครดิต
ดูรายชื่อเต็มของผู้มีส่วนร่วมใน Rails ได้ที่ รายชื่อผู้มีส่วนร่วมใน Rails สำหรับผู้ที่ใช้เวลาหลายชั่วโมงในการสร้าง Rails เป็นเฟรมเวิร์กที่เสถียรและแข็งแรง ยินดีกับทุกคน
บันทึกการเปิดตัว Rails 3.1 ถูกรวบรวมโดย Vijay Dev
ข้อเสนอแนะ
คุณสามารถช่วยปรับปรุงคุณภาพของคู่มือนี้ได้
กรุณาช่วยเพิ่มเติมหากพบข้อผิดพลาดหรือข้อผิดพลาดทางความจริง เพื่อเริ่มต้นคุณสามารถอ่านส่วน การสนับสนุนเอกสาร ของเราได้
คุณอาจพบเนื้อหาที่ไม่สมบูรณ์หรือเนื้อหาที่ไม่ได้อัปเดต กรุณาเพิ่มเอกสารที่ขาดหายไปสำหรับเนื้อหาหลัก โปรดตรวจสอบ Edge Guides ก่อนเพื่อตรวจสอบ ว่าปัญหาได้รับการแก้ไขหรือไม่ในสาขาหลัก ตรวจสอบ คู่มือแนวทาง Ruby on Rails เพื่อดูรูปแบบและกฎเกณฑ์
หากคุณพบข้อผิดพลาดแต่ไม่สามารถแก้ไขได้เอง กรุณา เปิดปัญหา.
และสุดท้าย การสนทนาใด ๆ เกี่ยวกับ Ruby on Rails เอกสารยินดีต้อนรับที่สุดใน เว็บบอร์ดอย่างเป็นทางการของ Ruby on Rails.