-
Notifications
You must be signed in to change notification settings - Fork 0
/
4_2_release_notes.html
873 lines (815 loc) · 57.2 KB
/
4_2_release_notes.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Ruby on Rails 4.2 發佈記 — Ruby on Rails 指南</title>
<meta name="description" content="Ruby on Rails 指南:系統學習 Rails(Rails 4.2 版本)" >
<meta name="keywords" content="Ruby on Rails Guides 指南 中文 學習 免費 網路 Web 開發" >
<meta name="author" content="http://git.io/G_R1sA">
<meta property="fb:admins" content="1340181291">
<meta property="og:title" content="Ruby on Rails 4.2 發佈記 — Ruby on Rails 指南" >
<meta property="og:site_name" content="Ruby on Rails 指南">
<meta property="og:image" content="http://rails.ruby.tw/images/rails_guides_cover.jpg">
<meta property="og:url" content="http://rails.ruby.tw/">
<meta property="og:type" content="article">
<meta property="og:description" content="Ruby on Rails 指南:系統學習 Rails(Rails 4.2 版本)">
<link rel="stylesheet" href="stylesheets/application.css">
<link href="http://fonts.googleapis.com/css?family=Noto+Sans:400,700|Noto+Serif:700|Source+Code+Pro" rel="stylesheet">
<link href="images/favicon.ico" rel="shortcut icon" type="image/x-icon">
</head>
<body class="guide">
<div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/zh-TW/sdk.js#xfbml=1&appId=837401439623727&version=v2.0";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
<script type="text/javascript">
window.twttr=(function(d,s,id){var t,js,fjs=d.getElementsByTagName(s)[0];if(d.getElementById(id)){return}js=d.createElement(s);js.id=id;js.src="https://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);return window.twttr||(t={_e:[],ready:function(f){t._e.push(f)}})}(document,"script","twitter-wjs"));
</script>
<div id="topNav">
<div class="wrapper">
<strong class="more-info-label">更多內容 <a href="http://rubyonrails.org/">rubyonrails.org:</a></strong>
<span class="red-button more-info-button">
更多內容
</span>
<ul class="more-info-links s-hidden">
<li class="more-info"><a href="http://rubyonrails.org/">綜覽</a></li>
<li class="more-info"><a href="http://rubyonrails.org/download">下載</a></li>
<li class="more-info"><a href="http://rubyonrails.org/deploy">部署</a></li>
<li class="more-info"><a href="https://github.com/rails/rails">原始碼</a></li>
<li class="more-info"><a href="http://rubyonrails.org/screencasts">影片</a></li>
<li class="more-info"><a href="http://rubyonrails.org/documentation">文件</a></li>
<li class="more-info"><a href="http://rubyonrails.org/community">社群</a></li>
<li class="more-info"><a href="http://weblog.rubyonrails.org/">Blog</a></li>
</ul>
</div>
</div>
<div id="header">
<div class="wrapper clearfix">
<h1><a href="index.html" title="回首頁">Guides.rubyonrails.org</a></h1>
<ul class="nav">
<li><a class="nav-item" href="index.html">首頁</a></li>
<li class="guides-index guides-index-large">
<a href="index.html" id="guidesMenu" class="guides-index-item nav-item">指南目錄</a>
<div id="guides" class="clearfix" style="display: none;">
<hr>
<dl class="L">
<dt>起步走</dt>
<dd><a href="getting_started.html">Rails 起步走</a></dd>
<dt>Models</dt>
<dd><a href="active_record_basics.html">Active Record 基礎</a></dd>
<dd><a href="active_record_migrations.html">Active Record 遷移</a></dd>
<dd><a href="active_record_validations.html">Active Record 驗證</a></dd>
<dd><a href="active_record_callbacks.html">Active Record 回呼</a></dd>
<dd><a href="association_basics.html">Active Record 關聯</a></dd>
<dd><a href="active_record_querying.html">Active Record 查詢</a></dd>
<dt>Views</dt>
<dd><a href="layouts_and_rendering.html">Rails 算繪與版型</a></dd>
<dd><a href="form_helpers.html">Action View 表單輔助方法</a></dd>
<dt>Controllers</dt>
<dd><a href="action_controller_overview.html">Action Controller 綜覽</a></dd>
<dd><a href="routing.html">Rails 路由:深入淺出</a></dd>
</dl>
<dl class="R">
<dt>深入了解</dt>
<dd><a href="active_support_core_extensions.html">Active Support 核心擴展</a></dd>
<dd><a href="i18n.html">Rails 國際化 API</a></dd>
<dd><a href="action_mailer_basics.html">Action Mailer 基礎</a></dd>
<dd><a href="active_job_basics.html">Active Job 基礎</a></dd>
<dd><a href="security.html">Rails 安全指南</a></dd>
<dd><a href="debugging_rails_applications.html">除錯 Rails 應用程式</a></dd>
<dd><a href="configuring.html">Rails 應用程式設定</a></dd>
<dd><a href="command_line.html">Rake 任務與 Rails 命令列工具</a></dd>
<dd><a href="asset_pipeline.html">Asset Pipeline</a></dd>
<dd><a href="working_with_javascript_in_rails.html">在 Rails 使用 JavaScript</a></dd>
<dd><a href="constant_autoloading_and_reloading.html">Constant Autoloading and Reloading</a></dd>
<dt>擴充 Rails</dt>
<dd><a href="rails_on_rack.html">Rails on Rack</a></dd>
<dd><a href="generators.html">客製與新建 Rails 產生器</a></dd>
<dd><a href="rails_application_templates.html">Rails 應用程式模版</a></dd>
<dt>貢獻 Ruby on Rails</dt>
<dd><a href="contributing_to_ruby_on_rails.html">貢獻 Ruby on Rails</a></dd>
<dd><a href="api_documentation_guidelines.html">API 文件準則</a></dd>
<dd><a href="ruby_on_rails_guides_guidelines.html">Ruby on Rails 指南準則</a></dd>
<dt>維護方針</dt>
<dd><a href="maintenance_policy.html">維護方針</a></dd>
<dt>發佈記</dt>
<dd><a href="upgrading_ruby_on_rails.html">升級 Ruby on Rails</a></dd>
<dd><a href="4_2_release_notes.html">Ruby on Rails 4.2 發佈記</a></dd>
<dd><a href="4_1_release_notes.html">Ruby on Rails 4.1 發佈記</a></dd>
<dd><a href="4_0_release_notes.html">Ruby on Rails 4.0 發佈記</a></dd>
<dd><a href="3_2_release_notes.html">Ruby on Rails 3.2 發佈記</a></dd>
<dd><a href="3_1_release_notes.html">Ruby on Rails 3.1 發佈記</a></dd>
<dd><a href="3_0_release_notes.html">Ruby on Rails 3.0 發佈記</a></dd>
<dd><a href="2_3_release_notes.html">Ruby on Rails 2.3 發佈記</a></dd>
<dd><a href="2_2_release_notes.html">Ruby on Rails 2.2 發佈記</a></dd>
<dt>Rails 指南翻譯術語</dt>
<dd><a href="translation_terms.html">翻譯術語</a></dd>
</dl>
</div>
</li>
<li><a class="nav-item" href="//github.com/docrails-tw/guides">貢獻翻譯</a></li>
<li><a class="nav-item" href="contributing_to_ruby_on_rails.html">貢獻</a></li>
<li><a class="nav-item" href="credits.html">致謝</a></li>
<li class="guides-index guides-index-small">
<select class="guides-index-item nav-item">
<option value="index.html">指南目錄</option>
<optgroup label="起步走">
<option value="getting_started.html">Rails 起步走</option>
</optgroup>
<optgroup label="Models">
<option value="active_record_basics.html">Active Record 基礎</option>
<option value="active_record_migrations.html">Active Record 遷移</option>
<option value="active_record_validations.html">Active Record 驗證</option>
<option value="active_record_callbacks.html">Active Record 回呼</option>
<option value="association_basics.html">Active Record 關聯</option>
<option value="active_record_querying.html">Active Record 查詢</option>
</optgroup>
<optgroup label="Views">
<option value="layouts_and_rendering.html">Rails 算繪與版型</option>
<option value="form_helpers.html">Action View 表單輔助方法</option>
</optgroup>
<optgroup label="Controllers">
<option value="action_controller_overview.html">Action Controller 綜覽</option>
<option value="routing.html">Rails 路由:深入淺出</option>
</optgroup>
<optgroup label="深入了解">
<option value="active_support_core_extensions.html">Active Support 核心擴展</option>
<option value="i18n.html">Rails 國際化 API</option>
<option value="action_mailer_basics.html">Action Mailer 基礎</option>
<option value="active_job_basics.html">Active Job 基礎</option>
<option value="security.html">Rails 安全指南</option>
<option value="debugging_rails_applications.html">除錯 Rails 應用程式</option>
<option value="configuring.html">Rails 應用程式設定</option>
<option value="command_line.html">Rake 任務與 Rails 命令列工具</option>
<option value="asset_pipeline.html">Asset Pipeline</option>
<option value="working_with_javascript_in_rails.html">在 Rails 使用 JavaScript</option>
<option value="constant_autoloading_and_reloading.html">Constant Autoloading and Reloading</option>
</optgroup>
<optgroup label="擴充 Rails">
<option value="rails_on_rack.html">Rails on Rack</option>
<option value="generators.html">客製與新建 Rails 產生器</option>
<option value="rails_application_templates.html">Rails 應用程式模版</option>
</optgroup>
<optgroup label="貢獻 Ruby on Rails">
<option value="contributing_to_ruby_on_rails.html">貢獻 Ruby on Rails</option>
<option value="api_documentation_guidelines.html">API 文件準則</option>
<option value="ruby_on_rails_guides_guidelines.html">Ruby on Rails 指南準則</option>
</optgroup>
<optgroup label="維護方針">
<option value="maintenance_policy.html">維護方針</option>
</optgroup>
<optgroup label="發佈記">
<option value="upgrading_ruby_on_rails.html">升級 Ruby on Rails</option>
<option value="4_2_release_notes.html">Ruby on Rails 4.2 發佈記</option>
<option value="4_1_release_notes.html">Ruby on Rails 4.1 發佈記</option>
<option value="4_0_release_notes.html">Ruby on Rails 4.0 發佈記</option>
<option value="3_2_release_notes.html">Ruby on Rails 3.2 發佈記</option>
<option value="3_1_release_notes.html">Ruby on Rails 3.1 發佈記</option>
<option value="3_0_release_notes.html">Ruby on Rails 3.0 發佈記</option>
<option value="2_3_release_notes.html">Ruby on Rails 2.3 發佈記</option>
<option value="2_2_release_notes.html">Ruby on Rails 2.2 發佈記</option>
</optgroup>
<optgroup label="Rails 指南翻譯術語">
<option value="translation_terms.html">翻譯術語</option>
</optgroup>
</select>
</li>
</ul>
</div>
</div>
</div>
<hr class="hide">
<div id="feature">
<div class="wrapper">
<h2>Ruby on Rails 4.2 發佈記</h2><p>Rails 4.2 精華摘要:</p>
<ul>
<li>Active Job</li>
<li>異步寄信</li>
<li>Adequate Record</li>
<li>Web Console</li>
<li>外鍵支援</li>
</ul>
<p>本篇僅記錄主要的變化。要了解關於已修復的 Bug、功能變更等,請參考 <a href="https://github.com/rails/rails">Rails GitHub 主頁</a>上各個 Gem 的 CHANGELOG 或是 <a href="https://github.com/rails/rails/commits/master">Rails 的提交歷史</a>。</p>
<div id="subCol">
<h3 class="chapter"><img src="images/chapters_icon.gif" alt="" />Chapters</h3>
<ol class="chapters">
<li><a href="#%E5%8D%87%E7%B4%9A%E8%87%B3-rails-4-2">升級至 Rails 4.2</a></li>
<li>
<a href="#%E4%B8%BB%E8%A6%81%E7%9A%84%E6%96%B0%E5%8A%9F%E8%83%BD">主要的新功能</a>
<ul>
<li><a href="#active-job">Active Job</a></li>
<li><a href="#%E7%95%B0%E6%AD%A5%E9%83%B5%E4%BB%B6">異步郵件</a></li>
<li><a href="#adequate-record">Adequate Record</a></li>
<li><a href="#web-%E7%B5%82%E7%AB%AF">Web 終端</a></li>
<li><a href="#%E5%A4%96%E9%8D%B5%E6%94%AF%E6%8C%81">外鍵支持</a></li>
</ul>
</li>
<li>
<a href="#rails-4-2-%E5%90%91%E4%B8%8B%E4%B8%8D%E7%9B%B8%E5%AE%B9%E7%9A%84%E9%83%A8%E4%BB%BD">Rails 4.2 向下不相容的部份</a>
<ul>
<li><a href="#render-%E5%AD%97%E4%B8%B2%E5%8F%83%E6%95%B8"><code>render</code> 字串參數</a></li>
<li><a href="#respond-with-class-level-respond-to"><code>respond_with</code> / class-level <code>respond_to</code></a></li>
<li><a href="#rails-server-%E7%9A%84%E9%A0%90%E8%A8%AD%E4%B8%BB%E6%A9%9F%EF%BC%88host%EF%BC%89%E8%AE%8A%E6%9B%B4"><code>rails server</code> 的預設主機(host)變更</a></li>
<li><a href="#html-sanitizer">HTML Sanitizer</a></li>
<li><a href="#assert-select"><code>assert_select</code></a></li>
</ul>
</li>
<li>
<a href="#railties">Railties</a>
<ul>
<li><a href="#railties-%E7%A7%BB%E9%99%A4">移除</a></li>
<li><a href="#railties-%E6%A3%84%E7%94%A8">棄用</a></li>
<li><a href="#railties-%E5%80%BC%E5%BE%97%E4%B8%80%E6%8F%90%E7%9A%84%E8%AE%8A%E5%8C%96">值得一提的變化</a></li>
</ul>
</li>
<li>
<a href="#action-pack">Action Pack</a>
<ul>
<li><a href="#action-pack-%E7%A7%BB%E9%99%A4">移除</a></li>
<li><a href="#action-pack-%E6%A3%84%E7%94%A8">棄用</a></li>
<li><a href="#action-pack-%E5%80%BC%E5%BE%97%E4%B8%80%E6%8F%90%E7%9A%84%E8%AE%8A%E5%8C%96">值得一提的變化</a></li>
</ul>
</li>
<li>
<a href="#action-view">Action View</a>
<ul>
<li><a href="#action-view-%E6%A3%84%E7%94%A8">棄用</a></li>
<li><a href="#action-view-%E5%80%BC%E5%BE%97%E4%B8%80%E6%8F%90%E7%9A%84%E8%AE%8A%E5%8C%96">值得一提的變化</a></li>
</ul>
</li>
<li>
<a href="#action-mailer">Action Mailer</a>
<ul>
<li><a href="#action-mailer-%E6%A3%84%E7%94%A8">棄用</a></li>
<li><a href="#action-mailer-%E5%80%BC%E5%BE%97%E4%B8%80%E6%8F%90%E7%9A%84%E8%AE%8A%E5%8C%96">值得一提的變化</a></li>
</ul>
</li>
<li>
<a href="#active-record">Active Record</a>
<ul>
<li><a href="#active-record-%E7%A7%BB%E9%99%A4">移除</a></li>
<li><a href="#active-record-%E6%A3%84%E7%94%A8">棄用</a></li>
<li><a href="#active-record-%E5%80%BC%E5%BE%97%E4%B8%80%E6%8F%90%E7%9A%84%E8%AE%8A%E5%8C%96">值得一提的變化</a></li>
</ul>
</li>
<li>
<a href="#active-model">Active Model</a>
<ul>
<li><a href="#active-model-%E7%A7%BB%E9%99%A4">移除</a></li>
<li><a href="#active-model-%E6%A3%84%E7%94%A8">棄用</a></li>
<li><a href="#active-model-%E5%80%BC%E5%BE%97%E4%B8%80%E6%8F%90%E7%9A%84%E8%AE%8A%E5%8C%96">值得一提的變化</a></li>
</ul>
</li>
<li>
<a href="#active-support">Active Support</a>
<ul>
<li><a href="#%E7%A7%BB%E9%99%A4">移除</a></li>
<li><a href="#%E6%A3%84%E7%94%A8">棄用</a></li>
<li><a href="#%E5%80%BC%E5%BE%97%E4%B8%80%E6%8F%90%E7%9A%84%E8%AE%8A%E5%8C%96">值得一提的變化</a></li>
</ul>
</li>
<li><a href="#%E8%87%B4%E8%AC%9D">致謝</a></li>
</ol>
</div>
</div>
</div>
<div id="container">
<div class="wrapper">
<div id="mainCol">
<h3 id="升級至-rails-4-2">1 升級至 Rails 4.2</h3><p>如果您正試著升級現有的應用程式,應用程式最好要有足夠的測試。第一步先升級至 4.1,確保應用程式仍正常工作,接著再升上 4.2。升級需要注意的事項在 <a href="upgrading_ruby_on_rails.html#upgrading-from-rails-4-1-to-rails-4-2">Ruby on Rails 升級指南</a>可以找到。</p><h3 id="主要的新功能">2 主要的新功能</h3><h4 id="active-job">2.1 Active Job</h4><p>Active Job 是 Rails 4.2 新搭載的框架。是佇列系統(Queuing systems)的統一接口,用來連接像是 <a href="https://github.com/resque/resque">Resque</a>、<a href="https://github.com/collectiveidea/delayed_job">Delayed
Job</a>、<a href="https://github.com/mperham/sidekiq">Sidekiq</a> 等佇列系統。</p><p>採用 Active Job API 撰寫的背景任務程式(Background jobs),便可在任何支持的佇列系統上運行而無需對程式碼進行任何修改。Active Job 預設會即時執行任務。</p><p>任務通常需要傳入 Active Record 物件作為參數。Active Job 將傳入的物件作為 URI(統一資源標識符),而不是直接對物件進行 marshal。新增的 GlobalID 函式庫,給物件生成統一資源標識符,並使用該標識符來查找物件。現在因為內部使用了 Global ID,任務只要傳入 Active Record 物件即可。</p><p>譬如,<code>trashable</code> 是一個 Active Record 物件,則下面這個任務無需做任何序列化,便可正常完成任務:</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
class TrashableCleanupJob < ActiveJob::Base
def perform(trashable, depth)
trashable.cleanup(depth)
end
end
</pre>
</div>
<p>參考 <a href="active_job_basics.html">Active Job 基礎</a>指南來進一步瞭解。</p><h4 id="異步郵件">2.2 異步郵件</h4><p>基於 Active Job 之上,Action Mailer 新增了 <code>#deliver_later</code> 方法,通過佇列來發送郵件,若開啓了佇列的異步特性,便不會拖慢控制器或模型的運行(預設佇列是即時執行任務)。</p><p>想直接發送信件仍可以使用 <code>deliver_now</code>。</p><h4 id="adequate-record">2.3 Adequate Record</h4><p>Adequate Record 是對 Active Record <code>find</code> 和 <code>find_by</code> 方法以及其它的關聯查詢方法所進行的一系列重構,查詢速度最高提升到了兩倍之多。</p><p>工作原理是在執行 Active Record 調用時,把 SQL 查詢語句快取起來。有了查詢語句的快取之後,同樣的 SQL 查詢就無需再次把調用轉換成 SQL 語句。更多細節請參考 <a href="http://tenderlovemaking.com/2014/02/19/adequaterecord-pro-like-activerecord.html">Aaron Patterson 的博文</a>。</p><p>Adequate Record 已經合併到 Rails 里,所以不需要特別啓用這個特性。多數的 <code>find</code> 和 <code>find_by</code> 調用和關聯查詢會自動使用 Adequate Record,比如:</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
Post.find(1) # First call generates and cache the prepared statement
Post.find(2) # Subsequent calls reuse the cached prepared statement
Post.find_by_title('first post')
Post.find_by_title('second post')
post.comments
post.comments(true)
</pre>
</div>
<p>有一點特別要說明的是,如上例所示,快取的語句不會快取傳入的數值,只是快取查詢語句的模版而已。</p><p>下列場景則不會使用緩存:</p>
<ul>
<li>當 model 有預設作用域時</li>
<li>當 model 使用了單表繼承時</li>
<li>當 <code>find</code> 查詢一組 ID 時:</li>
</ul>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
# not cached
Post.find(1, 2, 3)
Post.find([1,2])
</pre>
</div>
<ul>
<li>以 SQL 片段執行 <code>find_by</code>:</li>
</ul>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
Post.find_by('published_at < ?', 2.weeks.ago)
</pre>
</div>
<h4 id="web-終端">2.4 Web 終端</h4><p>用 Rails 4.2 新產生的應用程式,預設搭載了 <a href="https://github.com/rails/web-console">Web 終端</a>。Web 終端給錯誤頁面添加了一個互動式 Ruby 終端,並提供視圖幫助方法 <code>console</code>,以及一些控制器幫助方法。</p><p>錯誤頁面的互動式的終端,讓你可以在異常發生的地方執行程式碼。插入 <code>console</code> 視圖幫助方法到任何頁面,便可以在頁面的上下文里,在頁面算繪(render)結束後啓動一個互動式的終端。</p><p>最後,可以執行 <code>rails console</code> 來啓動一個 VT100 終端。若需要建立或修改測試資料,可以直接從瀏覽器里執行。</p><h4 id="外鍵支持">2.5 外鍵支持</h4><p>遷移 DSL 現在支持新增、移除外鍵,外鍵也會導出到 <code>schema.rb</code>。目前只有 <code>mysql</code>、<code>mysql2</code> 以及 <code>postgresql</code> 的連接器(adapter)支持外鍵。</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
# add a foreign key to `articles.author_id` referencing `authors.id`
add_foreign_key :articles, :authors
# add a foreign key to `articles.author_id` referencing `users.lng_id`
add_foreign_key :articles, :users, column: :author_id, primary_key: "lng_id"
# remove the foreign key on `accounts.branch_id`
remove_foreign_key :accounts, :branches
# remove the foreign key on `accounts.owner_id`
remove_foreign_key :accounts, column: :owner_id
</pre>
</div>
<p>完整說明請參考 API 文檔:<a href="http://api.rubyonrails.org/v4.2.0/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_foreign_key">add_foreign_key</a> 和 <a href="http://api.rubyonrails.org/v4.2.0/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-remove_foreign_key">remove_foreign_key</a>。</p><h3 id="rails-4-2-向下不相容的部份">3 Rails 4.2 向下不相容的部份</h3><p>前版棄用的功能已全部移除。請參考文後下列各 Rails 元件來了解 Rails 4.2 新棄用的功能有那些。</p><p>以下是升級至 Rails 4.2 所需要立即採取的行動。</p><h4 id="render-字串參數">3.1 <code>render</code> 字串參數</h4><p>4.2 以前在 Controller 動作呼叫 <code>render "foo/bar"</code> 時,效果等同於:<code>render file: "foo/bar"</code>;Rails 4.2 被改為 <code>render template: "foo/bar"</code>。如需 <code>render</code> 檔案,請將程式碼改為 <code>render file: "foo/bar"</code>。</p><h4 id="respond-with-class-level-respond-to">3.2 <code>respond_with</code> / class-level <code>respond_to</code>
</h4><p><code>respond_with</code> 以及對應的<strong>類別層級</strong> <code>respond_to</code> 被移到了 <code>responders</code> gem。要使用這個功能,把 <code>gem 'responders', '~> 2.0'</code> 加入到 Gemfile:</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
# app/controllers/users_controller.rb
class UsersController < ApplicationController
respond_to :html, :json
def show
@user = User.find(params[:id])
respond_with @user
end
end
</pre>
</div>
<p>而實體層級的 <code>respond_to</code> 則不受影響:</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
# 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
</pre>
</div>
<h4 id="rails-server-的預設主機(host)變更">3.3 <code>rails server</code> 的預設主機(host)變更</h4><p>由於 <a href="https://github.com/rack/rack/commit/28b014484a8ac0bbb388e7eaeeef159598ec64fc">Rack 的一項修正</a>,<code>rails server</code> 現在預設會監聽 <code>localhost</code> 而不是 <code>0.0.0.0</code>。<a href="http://127.0.0.1:3000">http://127.0.0.1:3000</a> 和 <a href="http://localhost:3000">http://localhost:3000</a> 仍可以像以前一樣使用。</p><p>但這項變更禁止了從其它機器訪問 Rails 伺服器(譬如開發環境位於虛擬環境裡,而想要從宿主機器上訪問),會需要用 <code>rails server -b 0.0.0.0</code> 來啟動才能像之前一樣使用。</p><p>若是使用了 <code>0.0.0.0</code>,記得要把防火牆設定好,改成只有信任的機器才可以存取你的開發伺服器。</p><h4 id="html-sanitizer">3.4 HTML Sanitizer</h4><p>HTML sanitizer 換成一個新的、更加安全的實作,基於 Loofah 和 Nokogiri。新的 Sanitizer 更安全,而 sanitization 更加完善與靈活。</p><p>有了新的 sanitization 演算法之後,某些 pathological 的輸入的輸出會和之前不一樣。</p><p>若真的需要使用舊的 sanitizer,可以把 <code>rails-deprecated_sanitizer</code> 加到 Gemfile,便會用舊的 sanitizer 取代掉新的。因為這是自己選擇性加入的 gem,所以並不會拋出棄用警告。</p><p>Rails 4.2 仍會維護 <code>rails-deprecated_sanitizer</code>,但 Rails 5.0 之後便不會再進行維護。</p><p>參考<a href="http://blog.plataformatec.com.br/2014/07/the-new-html-sanitizer-in-rails-4-2/">這篇文章</a>來了解更多關於新的 sanitizer 的變更內容細節。</p><h4 id="assert-select">3.5 <code>assert_select</code>
</h4><p><code>assert_select</code> 測試方法現在用 Nokogiri 改寫。</p><p>不再支援某些先前可用的選擇器。若應用程式使用了以下的選擇器,則會需要進行更新:</p>
<ul>
<li>
<p> 屬性選擇器的數值需要用雙引號包起來。</p>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
a[href=/] => a[href="/"]
a[href$=/] => a[href$="/"]
</pre>
</div>
</li>
<li>
<p> 含有錯誤嵌套的 HTML 所建出來的 DOM 可能會不一樣</p>
<p>譬如:</p>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
# content: <div><i><p></i></div>
# before:
assert_select('div > i') # => true
assert_select('div > p') # => false
assert_select('i > p') # => true
# now:
assert_select('div > i') # => true
assert_select('div > p') # => true
assert_select('i > p') # => false
</pre>
</div>
</li>
<li>
<p> 之前要比較含有 HTML entities 的元素要寫未經轉譯的 HTML,現在寫轉譯後的即可</p>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
# content: <p>AT&amp;T</p>
# before:
assert_select('p', 'AT&amp;T') # => true
assert_select('p', 'AT&T') # => false
# now:
assert_select('p', 'AT&T') # => true
assert_select('p', 'AT&amp;T') # => false
</pre>
</div>
</li>
</ul>
<h3 id="railties">4 Railties</h3><p>請參考 <a href="https://github.com/rails/rails/blob/4-2-stable/railties/CHANGELOG.md">CHANGELOG</a> 來了解更多細節。</p><h4 id="railties-移除">4.1 移除</h4>
<ul>
<li><p> <code>--skip-action-view</code> 選項從 app generator 移除了。(<a href="https://github.com/rails/rails/pull/17042">Pull Request</a>)</p></li>
<li><p> 移除 <code>rails application</code> 命令。(<a href="https://github.com/rails/rails/pull/11616">Pull Request</a>)</p></li>
</ul>
<h4 id="railties-棄用">4.2 棄用</h4>
<ul>
<li><p> Production 環境新增 <code>config.log_level</code> 設定。
(<a href="https://github.com/rails/rails/pull/16622">Pull Request</a>)</p></li>
<li><p> 棄用 <code>rake test:all</code>,請改用 <code>rake test</code> 來執行 <code>test</code> 目錄下的所有測試。
(<a href="https://github.com/rails/rails/pull/17348">Pull Request</a>)</p></li>
<li><p> 棄用 <code>rake test:all:db</code>,請改用 <code>rake test:db</code>。
(<a href="https://github.com/rails/rails/pull/17348">Pull Request</a>)</p></li>
<li><p> 棄用 <code>Rails::Rack::LogTailer</code>,沒有替代方案。(<a href="https://github.com/rails/rails/commit/84a13e019e93efaa8994b3f8303d635a7702dbce">Commit</a>)</p></li>
</ul>
<h4 id="railties-值得一提的變化">4.3 值得一提的變化</h4>
<ul>
<li><p> <code>web-console</code> 導入為內建的 Gem。
(<a href="https://github.com/rails/rails/pull/11667">Pull Request</a>)</p></li>
<li><p> Model 用來產生關聯的產生器新增 <code>required</code> 選項。
(<a href="https://github.com/rails/rails/pull/16062">Pull Request</a>)</p></li>
<li><p> 導入 <code>after_bundle</code> 回呼到 Rails 模版。
(<a href="https://github.com/rails/rails/pull/16359">Pull Request</a>)</p></li>
<li>
<p> 導入 <code>x</code> 命名空間,用來自訂設定選項:</p>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
# config/environments/production.rb
config.x.payment_processing.schedule = :daily
config.x.payment_processing.retries = 3
config.x.super_debugger = true
</pre>
</div>
<p>這些選項都可以從設定物件裡獲取:</p>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
Rails.configuration.x.payment_processing.schedule # => :daily
Rails.configuration.x.payment_processing.retries # => 3
Rails.configuration.x.super_debugger # => true
</pre>
</div>
<p>(<a href="https://github.com/rails/rails/commit/611849772dd66c2e4d005dcfe153f7ce79a8a7db">Commit</a>)</p>
</li>
<li>
<p> 導入 <code>Rails::Application.config_for</code>,用來給當前的環境載入設定</p>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
# 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/production.rb
Rails.application.configure do
config.middleware.use ExceptionNotifier, config_for(:exception_notification)
end
</pre>
</div>
<p>(<a href="https://github.com/rails/rails/pull/16129">Pull Request</a>)</p>
</li>
<li><p> 產生器新增 <code>--skip-turbolinks</code> 選項,新建應用程式便不會內建 turbolink。
(<a href="https://github.com/rails/rails/commit/bf17c8a531bc8059d50ad731398002a3e7162a7d">Commit</a>)</p></li>
<li><p> 導入 <code>bin/setup</code> 腳本來啟動應用程式。
(<a href="https://github.com/rails/rails/pull/15189">Pull Request</a>)</p></li>
<li><p> <code>config.assets.digest</code> 在開發模式的預設值改為 <code>true</code>。
(<a href="https://github.com/rails/rails/pull/15155">Pull Request</a>)</p></li>
<li><p> 導入給 <code>rake notes</code> 註冊新擴充功能的 API。
(<a href="https://github.com/rails/rails/pull/14379">Pull Request</a>)</p></li>
<li><p> 導入 <code>Rails.gem_version</code> 作為回傳 <code>Gem::Version.new(Rails.version)</code> 的便捷方法。
(<a href="https://github.com/rails/rails/pull/14101">Pull Request</a>)</p></li>
</ul>
<h3 id="action-pack">5 Action Pack</h3><p>請參考 <a href="https://github.com/rails/rails/blob/4-2-stable/actionpack/CHANGELOG.md">CHANGELOG</a> 來了解更多細節。</p><h4 id="action-pack-移除">5.1 移除</h4>
<ul>
<li><p> 將 <code>respond_with</code> 以及類別層級的 <code>respond_to</code> 從 Rails 移除,移到 <code>responders</code> gem(版本 2.0)。要繼續使用這個功能,請在 Gemfile 加入:<code>gem 'responders', '~> 2.0'</code>。(<a href="https://github.com/rails/rails/pull/16526">Pull Request</a>)</p></li>
<li><p> 移除棄用的 <code>AbstractController::Helpers::ClassMethods::MissingHelperError</code>,
改用 <code>AbstractController::Helpers::MissingHelperError</code> 取代。
(<a href="https://github.com/rails/rails/commit/a1ddde15ae0d612ff2973de9cf768ed701b594e8">Commit</a>)</p></li>
</ul>
<h4 id="action-pack-棄用">5.2 棄用</h4>
<ul>
<li><p> 棄用 <code>*_path</code> 輔助方法的 <code>only_path</code> 選項。
(<a href="https://github.com/rails/rails/commit/aa1fadd48fb40dd9396a383696134a259aa59db9">Commit</a>)</p></li>
<li><p> 棄用 <code>assert_tag</code>、<code>assert_no_tag</code>、<code>find_tag</code> 以及 <code>find_all_tag</code>,請改用 <code>assert_select</code>。
(<a href="https://github.com/rails/rails-dom-testing/commit/b12850bc5ff23ba4b599bf2770874dd4f11bf750">Commit</a>)</p></li>
<li>
<p>棄用路由的 <code>:to</code> 選項裡,<code>:to</code> 可以指向符號或不含井號的字串這兩個功能。</p>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
get '/posts', to: MyRackApp => (No change necessary)
get '/posts', to: 'post#index' => (No change necessary)
get '/posts', to: 'posts' => get '/posts', controller: :posts
get '/posts', to: :index => get '/posts', action: :index
</pre>
</div>
<p>(<a href="https://github.com/rails/rails/commit/cc26b6b7bccf0eea2e2c1a9ebdcc9d30ca7390d9">Commit</a>)</p>
</li>
<li>
<p> 棄用 URL 輔助方法不再支持使用字串作為鍵:</p>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
# bad
root_path('controller' => 'posts', 'action' => 'index')
# good
root_path(controller: 'posts', action: 'index')
</pre>
</div>
<p>(<a href="https://github.com/rails/rails/pull/17743">Pull Request</a>)</p>
</li>
</ul>
<h4 id="action-pack-值得一提的變化">5.3 值得一提的變化</h4>
<ul>
<li>
<p> <code>*_filter</code> 方法已經從文件中移除,已經不鼓勵使用。偏好使用 <code>*_action</code> 方法:</p>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
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
</pre>
</div>
<p>若應用程式依賴這些 <code>*_filter</code> 方法,應該使用 <code>*_action</code> 方法替換。
因為 <code>*_filter</code> 方法最終會從 Rails 裡拿掉。
(Commit <a href="https://github.com/rails/rails/commit/6c5f43bab8206747a8591435b2aa0ff7051ad3de">1</a>,
<a href="https://github.com/rails/rails/commit/489a8f2a44dc9cea09154ee1ee2557d1f037c7d4">2</a>)</p>
</li>
<li><p> <code>render nothing: true</code> 或算繪 <code>nil</code> 不再加入一個空白到響應主體。
(<a href="https://github.com/rails/rails/pull/14883">Pull Request</a>)</p></li>
<li><p> Rails 現在會自動把模版的 digest 加入到 ETag。
(<a href="https://github.com/rails/rails/pull/16527">Pull Request</a>)</p></li>
<li><p> 傳入 URL 輔助方法的片段現在會自動 Escaped。
(<a href="https://github.com/rails/rails/commit/5460591f0226a9d248b7b4f89186bd5553e7768f">Commit</a>)</p></li>
<li><p> 導入 <code>always_permitted_parameters</code> 選項,用來設定全局允許賦值的參數。
預設值是 <code>['controller', 'action']</code>。
(<a href="https://github.com/rails/rails/pull/15933">Pull Request</a>)</p></li>
<li><p> 從 <a href="https://tools.ietf.org/html/rfc4791">RFC 4791</a> 新增 HTTP 方法 <code>MKCALENDAR</code>。
(<a href="https://github.com/rails/rails/pull/15121">Pull Request</a>)</p></li>
<li><p> <code>*_fragment.action_controller</code> 通知訊息的 Payload 現在包含 Controller 與動作名稱。
(<a href="https://github.com/rails/rails/pull/14137">Pull Request</a>)</p></li>
<li><p> 改善路由錯誤頁面,搜索路由支持模糊搜尋。
(<a href="https://github.com/rails/rails/pull/14619">Pull Request</a>)</p></li>
<li><p> 新增關掉記錄 CSRF 失敗的選項。
(<a href="https://github.com/rails/rails/pull/14280">Pull Request</a>)</p></li>
<li><p> 當 Rails 伺服器設為提供靜態資源時,若客戶端支援 gzip,則會自動傳送預先產生好的 gzip 靜態資源。Asset Pipeline 預設會給所有可壓縮的靜態資源產生 <code>.gz</code> 檔。傳送 gzip 可將所需傳輸的資料量降到最小,並加速靜態資源請求的存取。當然若要在 Rails 線上環境提供靜態資源,最好還是使用 <a href="http://guides.rubyonrails.org/asset_pipeline.html#cdns">CDN</a>。(<a href="https://github.com/rails/rails/pull/16466">Pull Request</a>)</p></li>
<li>
<p> 在整合測試里呼叫 <code>process</code> 輔助方法時,路徑開頭需要有 <code>/</code>。以前可以忽略開頭的 <code>/</code>,但這是實作所產生的副產品,而不是有意新增的特性,譬如:</p>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
test "list all posts" do
get "/posts"
assert_response :success
end
</pre>
</div>
</li>
</ul>
<h3 id="action-view">6 Action View</h3><p>請參考 <a href="https://github.com/rails/rails/blob/4-2-stable/actionview/CHANGELOG.md">CHANGELOG</a> 來了解更多細節。</p><h4 id="action-view-棄用">6.1 棄用</h4>
<ul>
<li><p> 棄用 <code>AbstractController::Base.parent_prefixes</code>。想修改尋找 View 的位置,
請覆寫 <code>AbstractController::Base.local_prefixes</code>。
(<a href="https://github.com/rails/rails/pull/15026">Pull Request</a>)</p></li>
<li><p> 棄用 <code>ActionView::Digestor#digest(name, format, finder, options = {})</code>,
現在參數改用 Hash 傳入。
(<a href="https://github.com/rails/rails/pull/14243">Pull Request</a>)</p></li>
</ul>
<h4 id="action-view-值得一提的變化">6.2 值得一提的變化</h4>
<ul>
<li><p> <code>render "foo/bar"</code> 現在展開為 <code>render template: "foo/bar"</code> 而不是 <code>render file: "foo/bar"</code>。(<a href="https://github.com/rails/rails/pull/16888">Pull Request</a>)</p></li>
<li><p> 導入一個特別的 <code>#{partial_name}_iteration</code> 區域變數,給在 collection 裡算繪的局部頁面(Partial)使用。這個變數可以透過 <code>#index</code>、<code>#size</code>、<code>first?</code> 以及 <code>last?</code> 等方法來存取目前迭代的狀態。(<a href="https://github.com/rails/rails/pull/7698">Pull Request</a>)</p></li>
<li><p> 隱藏欄位的表單輔助方法不再產生含有行內樣式表的 <code><div></code> 元素。
(<a href="https://github.com/rails/rails/pull/14738">Pull Request</a>)</p></li>
<li><p> Placeholder I18n follows the same convention as <code>label</code> I18n.
(<a href="https://github.com/rails/rails/pull/16438">Pull Request</a>)</p></li>
</ul>
<h3 id="action-mailer">7 Action Mailer</h3><p>請參考 <a href="https://github.com/rails/rails/blob/4-2-stable/actionmailer/CHANGELOG.md">CHANGELOG</a> 來了解更多細節。</p><h4 id="action-mailer-棄用">7.1 棄用</h4>
<ul>
<li><p> Mailer 全部棄用 <code>*_path</code> 輔助方法。請全面改用 <code>*_url</code>。
(<a href="https://github.com/rails/rails/pull/15840">Pull Request</a>)</p></li>
<li><p> 棄用 <code>deliver</code> 與 <code>deliver!</code>,請改用 <code>deliver_now</code> 或 <code>deliver_now!</code>。
(<a href="https://github.com/rails/rails/pull/16582">Pull Request</a>)</p></li>
</ul>
<h4 id="action-mailer-值得一提的變化">7.2 值得一提的變化</h4>
<ul>
<li><p> <code>link_to</code> 和 <code>url_for</code> 在模版裡預設會產生絕對路徑,不再需要傳入 <code>only_path: false</code>。
(<a href="https://github.com/rails/rails/commit/9685080a7677abfa5d288a81c3e078368c6bb67c">Commit</a></p></li>
<li><p> 導入 <code>deliver_later</code> 方法,將要寄的信加到應用程式的佇列裡,用來異步發送信件。
(<a href="https://github.com/rails/rails/pull/16485">Pull Request</a>)</p></li>
<li><p> 新增 <code>show_previews</code> 選項,用來在開發環境之外啟用郵件預覽功能。
(<a href="https://github.com/rails/rails/pull/15970">Pull Request</a>)</p></li>
</ul>
<h3 id="active-record">8 Active Record</h3><p>請參考 <a href="https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md">CHANGELOG</a> 來了解更多細節。</p><h4 id="active-record-移除">8.1 移除</h4>
<ul>
<li><p> 移除 <code>cache_attributes</code> 以及其它相關的方法。現在所有屬性都有快取。
(<a href="https://github.com/rails/rails/pull/15429">Pull Request</a>)</p></li>
<li><p> 移除已棄用的方法 <code>ActiveRecord::Base.quoted_locking_column</code>.
(<a href="https://github.com/rails/rails/pull/15612">Pull Request</a>)</p></li>
<li><p> 移除已棄用的方法 <code>ActiveRecord::Migrator.proper_table_name</code>。
請改用 <code>ActiveRecord::Migration</code> 的實體方法:<code>proper_table_name</code>。
(<a href="https://github.com/rails/rails/pull/15512">Pull Request</a>)</p></li>
<li><p> 移除了未使用的 <code>:timestamp</code> 類型。把所有 <code>timestamp</code> 類型都改為 <code>:datetime</code> 的別名。
修正在 <code>ActiveRecord</code> 之外,欄位類型不一致的問題,譬如 XML 序列化。
(<a href="https://github.com/rails/rails/pull/15184">Pull Request</a>)</p></li>
</ul>
<h4 id="active-record-棄用">8.2 棄用</h4>
<ul>
<li><p> 棄用 <code>after_commit</code> 和 <code>after_rollback</code> 會吃掉錯誤的行為。
(<a href="https://github.com/rails/rails/pull/16537">Pull Request</a>)</p></li>
<li><p> 棄用對 <code>has_many :through</code> 自動偵測 counter cache 的支持。要自己對 <code>has_many</code> 與
<code>belongs_to</code> 關聯,給 <code>through</code> 的紀錄手動設定。
(<a href="https://github.com/rails/rails/pull/15754">Pull Request</a>)</p></li>
<li><p> 棄用 <code>sanitize_sql_hash_for_conditions</code>,沒有替代方案。使用
<code>Relation</code> 物件來進行查詢與更新是偏好的使用方式。
(<a href="https://github.com/rails/rails/commit/d5902c9e">Commit</a>)</p></li>
<li><p> 棄用未連接資料庫便呼叫 <code>DatabaseTasks.load_schema</code>,請改用 <code>DatabaseTasks.load_schema_current</code>。
(<a href="https://github.com/rails/rails/commit/f15cef67f75e4b52fd45655d7c6ab6b35623c608">Commit</a>)</p></li>
<li><p> 棄用 <code>Reflection#source_macro</code>,沒有替代方案。因為 Active Record 不再需要這個方法。
(<a href="https://github.com/rails/rails/pull/16373">Pull Request</a>)</p></li>
<li><p> 棄用 <code>.find</code> 或 <code>.exists?</code> 可傳入 Active Record 物件。請先對物件呼叫 <code>#id</code>。
(Commit <a href="https://github.com/rails/rails/commit/d92ae6ccca3bcfd73546d612efaea011270bd270">1</a>,
<a href="https://github.com/rails/rails/commit/d35f0033c7dec2b8d8b52058fb8db495d49596f7">2</a>)</p></li>
<li>
<p> 棄用僅支持一半的 PostgreSQL 範圍數值(不包含起始值)。目前我們把 PostgreSQL 的範圍對應到 Ruby 的範圍。但由於 Ruby 的範圍不支援不包含起始值,所以無法完全轉換。</p>
<p>目前的解決方法是將起始數遞增,這是不對的,已經棄用了。關於不知如何遞增的子類型(比如沒有定義 <code>#succ</code>)會對不包含起始值的拋出 <code>ArgumentError</code>。</p>
<p>(<a href="https://github.com/rails/rails/commit/91949e48cf41af9f3e4ffba3e5eecf9b0a08bfc3">Commit</a>)</p>
</li>
<li><p> 棄用沒有連上資料庫,缺可以呼叫 <code>DatabaseTasks.load_schema</code> 的行為。請改用 <code>DatabaseTasks.load_schema_current</code> 來取代。
(<a href="https://github.com/rails/rails/commit/f15cef67f75e4b52fd45655d7c6ab6b35623c608">Commit</a>)</p></li>
<li><p> 棄用 <code>sanitize_sql_hash_for_conditions</code>,沒有替代方案。使用 <code>Relation</code> 來進行查詢或更新是推薦的做法。
(<a href="https://github.com/rails/rails/commit/d5902c9e">Commit</a>)</p></li>
<li><p> 棄用 <code>add_timestamps</code> 和 <code>t.timestamps</code> 可不用傳入 <code>:null</code> 選項的行為。Rails 5 將把預設值 <code>null: true</code> 改為 <code>null: false</code>。
(<a href="https://github.com/rails/rails/pull/16481">Pull Request</a>)</p></li>
<li><p> 棄用 <code>Reflection#source_macro</code>,沒有替代方案。Active Record 不再需要這個方法了。
(<a href="https://github.com/rails/rails/pull/16373">Pull Request</a>)</p></li>
<li><p> 棄用了 <code>serialized_attributes</code>,沒有替代方案。
(<a href="https://github.com/rails/rails/pull/15704">Pull Request</a>)</p></li>
<li><p> 棄用了當欄位不存在時,還會從 <code>column_for_attribute</code> 回傳 <code>nil</code> 的情況。
Rails 5.0 將會回傳 Null 物件。
(<a href="https://github.com/rails/rails/pull/15878">Pull Request</a>)</p></li>
<li><p> 依賴實體狀態(有定義接受參數的作用域)的關聯現在不能使用 <code>.joins</code>、<code>.preload</code> 以及 <code>.eager_load</code> 了。
(<a href="https://github.com/rails/rails/commit/ed56e596a0467390011bc9d56d462539776adac1">Commit</a>)</p></li>
</ul>
<h4 id="active-record-值得一提的變化">8.3 值得一提的變化</h4>
<ul>
<li><p> <code>SchemaDumper</code> 對 <code>create_table</code> 使用 <code>force: :cascade</code>。這樣就可以重載加入外鍵的綱要文件。</p></li>
<li><p> 單數關聯增加 <code>:required</code> 選項,用來定義關聯的存在性驗證。
(<a href="https://github.com/rails/rails/pull/16056">Pull Request</a>)</p></li>
<li><p> PostgreSQL 連接器現在支持 PostgreSQL 9.4 的 <code>JSONB</code> 資料類型。
(<a href="https://github.com/rails/rails/pull/16220">Pull Request</a>)</p></li>
<li><p> 遷移的 <code>#references</code> 方法現在可以指定類型,<code>type</code> 選項,可用來指定外鍵的類型(比如 <code>:uuid</code>)。
(<a href="https://github.com/rails/rails/pull/16231">Pull Request</a>)</p></li>
<li><p> <code>ActiveRecord::Dirty</code> 現在會偵測可變數值的改變。序列化過的屬性有變更才會儲存。
修復了像是 PostgreSQL 不會偵測到變更的字串欄位、JSON 欄位。
(Pull Requests <a href="https://github.com/rails/rails/pull/15674">1</a>,
<a href="https://github.com/rails/rails/pull/15786">2</a>,
<a href="https://github.com/rails/rails/pull/15788">3</a>)</p></li>
<li><p> 導入 <code>bin/rake db:purge</code> 任務,用來清空當前環境的資料庫。
(<a href="https://github.com/rails/rails/commit/e2f232aba15937a4b9d14bd91e0392c6d55be58d">Commit</a>)</p></li>
<li><p> 導入 <code>ActiveRecord::Base#validate!</code>,會在記錄不合法時拋出 <code>RecordInvalid</code> 異常。
(<a href="https://github.com/rails/rails/pull/8639">Pull Request</a>)</p></li>
<li><p>引入 <code>#validate</code> 作為 <code>#valid?</code> 的別名。
(<a href="https://github.com/rails/rails/pull/14456">Pull Request</a>)</p></li>
<li><p><code>#touch</code> 現在可一次對多屬性操作。
(<a href="https://github.com/rails/rails/pull/14423">Pull Request</a>)</p></li>
<li><p> PostgreSQL 連接器現在支持 PostgreSQL 9.4+ 的 <code>jsonb</code> 資料類型。
(<a href="https://github.com/rails/rails/pull/16220">Pull Request</a>)</p></li>
<li><p> 新增 PostgreSQL 連接器的 <code>citext</code> 支持。
(<a href="https://github.com/rails/rails/pull/12523">Pull Request</a>)</p></li>
<li><p> PostgreSQL 與 SQLite 適配器不再默認限制字串只能 255 字元。
(<a href="https://github.com/rails/rails/pull/14579">Pull Request</a>)</p></li>
<li><p> 新增 PostgreSQL 連接器的使用自訂的範圍類型支持。
(<a href="https://github.com/rails/rails/commit/4cb47167e747e8f9dc12b0ddaf82bdb68c03e032">Commit</a>)</p></li>
<li><p> <code>sqlite3:///some/path</code> 現在可以解析系統的絕對路徑 <code>/some/path</code>。
相對路徑請使用 <code>sqlite3:some/path</code>。(先前是 <code>sqlite3:///some/path</code>
會解析成 <code>some/path</code>。這個行為已在 Rails 4.1 被棄用了。 Rails 4.1.)
(<a href="https://github.com/rails/rails/pull/14569">Pull Request</a>)</p></li>
<li><p> 新增 MySQL 5.6 以上版本的 fractional seconds 支持。
(Pull Request <a href="https://github.com/rails/rails/pull/8240">1</a>, <a href="https://github.com/rails/rails/pull/14359">2</a>)</p></li>
<li><p> 新增 <code>ActiveRecord::Base</code> 物件的 <code>#pretty_print</code> 方法。
(<a href="https://github.com/rails/rails/pull/15172">Pull Request</a>)</p></li>
<li><p> PostgreSQL 與 SQLite 連接器不再預設限制字串只能 255 字元。
(<a href="https://github.com/rails/rails/pull/14579">Pull Request</a>)</p></li>
<li><p> <code>ActiveRecord::Base#reload</code> 行為同 <code>m = Model.find(m.id)</code>,代表自訂的 <code>select</code> 不再保有額外的屬性。
meaning that it no longer retains the extra attributes from custom <code>select</code>s.
(<a href="https://github.com/rails/rails/pull/15866">Pull Request</a>)</p></li>
<li><p> <code>ActiveRecord::Base#reflections</code> 現在返回的 hash 的鍵是字串類型,而不是符號。 (<a href="https://github.com/rails/rails/pull/17718">Pull Request</a>)</p></li>
<li><p> 遷移的 <code>references</code> 方法支持 <code>type</code> 選項,用來指定外鍵的類型,比如 <code>:uuid</code>。
(<a href="https://github.com/rails/rails/pull/16231">Pull Request</a>)</p></li>
</ul>
<h3 id="active-model">9 Active Model</h3><p>請參考 <a href="https://github.com/rails/rails/blob/4-2-stable/activemodel/CHANGELOG.md">CHANGELOG</a> 來了解更多細節。</p><h4 id="active-model-移除">9.1 移除</h4>
<ul>
<li> 移除了 <code>Validator#setup</code>,沒有替代方案。
(<a href="https://github.com/rails/rails/pull/15617">Pull Request</a>)</li>
</ul>
<h4 id="active-model-棄用">9.2 棄用</h4>
<ul>
<li><p> 棄用 <code>reset_#{attribute}</code>,請改用 <code>restore_#{attribute}</code>。
(<a href="https://github.com/rails/rails/pull/16180">Pull Request</a>)</p></li>
<li><p> 棄用 <code>ActiveModel::Dirty#reset_changes</code>,請改用 <code>#clear_changes_information</code>。
(<a href="https://github.com/rails/rails/pull/16180">Pull Request</a>)</p></li>
</ul>
<h4 id="active-model-值得一提的變化">9.3 值得一提的變化</h4>
<ul>
<li><p> 引入 <code>#validate</code> 作為 <code>#valid?</code> 的別名。
(<a href="https://github.com/rails/rails/pull/14456">Pull Request</a>)</p></li>
<li><p> <code>ActiveModel::Dirty</code> 導入 <code>restore_attributes</code> 方法,用來恢復已修改的屬性到先前的數值。
(Pull Request <a href="https://github.com/rails/rails/pull/14861">1</a>,
<a href="https://github.com/rails/rails/pull/16180">2</a>)</p></li>
<li><p> <code>has_secure_password</code> 現在預設允許空密碼(只含空白的密碼也算空密碼)。
(<a href="https://github.com/rails/rails/pull/16412">Pull Request</a>)</p></li>
<li><p> 驗證啟用時,<code>has_secure_password</code> 現在會檢查密碼是否少於 72 個字元。
(<a href="https://github.com/rails/rails/pull/15708">Pull Request</a>)</p></li>
</ul>
<h3 id="active-support">10 Active Support</h3><p>請參考 <a href="https://github.com/rails/rails/blob/4-2-stable/activesupport/CHANGELOG.md">CHANGELOG</a> 來了解更多細節。</p><h4 id="移除">10.1 移除</h4>
<ul>
<li><p> 移除棄用的 <code>Numeric#ago</code>、<code>Numeric#until</code>、<code>Numeric#since</code> 以及
<code>Numeric#from_now</code>. (<a href="https://github.com/rails/rails/commit/f1eddea1e3f6faf93581c43651348f48b2b7d8bb">Commit</a>)</p></li>
<li><p> 移除棄用 <code>ActiveSupport::Callbacks</code> 基於字串的終止符。
(<a href="https://github.com/rails/rails/pull/15100">Pull Request</a>)</p></li>
</ul>
<h4 id="棄用">10.2 棄用</h4>
<ul>
<li><p> 棄用 <code>Kernel#silence_stderr</code>、<code>Kernel#capture</code> 以及 <code>Kernel#quietly</code> 方法,沒有替代方案。(<a href="https://github.com/rails/rails/pull/13392">Pull Request</a>)</p></li>
<li><p> 棄用 <code>Class#superclass_delegating_accessor</code>,請改用 <code>Class#class_attribute</code>。
(<a href="https://github.com/rails/rails/pull/14271">Pull Request</a>)</p></li>
<li><p> 棄用 <code>ActiveSupport::SafeBuffer#prepend!</code> 請改用 <code>ActiveSupport::SafeBuffer#prepend</code>(兩者功能相同)。
(<a href="https://github.com/rails/rails/pull/14529">Pull Request</a>)</p></li>
</ul>
<h4 id="值得一提的變化">10.3 值得一提的變化</h4>
<ul>
<li><p> 導入新的設定選項: <code>active_support.test_order</code>,用來指定測試執行的順序,預設是 <code>:sorted</code>,在 Rails 5.0 將會改成 <code>:random</code>。(<a href="https://github.com/rails/rails/commit/53e877f7d9291b2bf0b8c425f9e32ef35829f35b">Commit</a>)</p></li>
<li><p> <code>Object#try</code> 和 <code>Object#try!</code> 方法現在無需有訊息接收者也可以使用。
(<a href="https://github.com/rails/rails/commit/5e51bdda59c9ba8e5faf86294e3e431bd45f1830">Commit</a>,
<a href="https://github.com/rails/rails/pull/17361">Pull Request</a>)</p></li>
<li><p> <code>travel_to</code> 測試輔助方法現在會把 <code>usec</code> 部分截斷為 0。
(<a href="https://github.com/rails/rails/commit/9f6e82ee4783e491c20f5244a613fdeb4024beb5">Commit</a>)</p></li>
<li><p> 導入 <code>Object#itself</code> 作為 identity 函數(返回自身的函數)。(Commit <a href="https://github.com/rails/rails/commit/702ad710b57bef45b081ebf42e6fa70820fdd810">1</a> 和 <a href="https://github.com/rails/rails/commit/64d91122222c11ad3918cc8e2e3ebc4b0a03448a">2</a>)</p></li>
<li><p> <code>Object#with_options</code> 方法現在無需有訊息接收者也可以使用。
(<a href="https://github.com/rails/rails/pull/16339">Pull Request</a>)</p></li>
<li><p> 導入 <code>String#truncate_words</code> 方法,可指定要單字截斷至幾個單字。
(<a href="https://github.com/rails/rails/pull/16190">Pull Request</a>)</p></li>
<li><p> 新增 <code>Hash#transform_values</code> 與 <code>Hash#transform_values!</code> 方法,來簡化 Hash
值需要更新、但鍵保留不變這樣的常見模式。
(<a href="https://github.com/rails/rails/pull/15819">Pull Request</a>)</p></li>
<li><p> <code>humanize</code> 現在會去掉前面的底線。
(<a href="https://github.com/rails/rails/commit/daaa21bc7d20f2e4ff451637423a25ff2d5e75c7">Commit</a>)</p></li>
<li><p> 導入 <code>Concern#class_methods</code> 來取代 <code>module ClassMethods</code> 以及 <code>Kernel#concern</code>,
來避免使用 <code>module Foo; extend ActiveSupport::Concern; end</code> 這樣的樣板。
(<a href="https://github.com/rails/rails/commit/b16c36e688970df2f96f793a759365b248b582ad">Commit</a>)</p></li>
<li><p> 新增一篇<a href="constant_autoloading_and_reloading.html">指南</a>,關於常數的載入與重載。</p></li>
</ul>
<h3 id="致謝">11 致謝</h3><p>許多人花費寶貴的時間貢獻至 Rails 專案,使 Rails 成為更穩定、更強韌的網路框架,參考<a href="http://contributors.rubyonrails.org/">完整的 Rails 貢獻者清單</a>,感謝所有的貢獻者!</p>
<h3>反饋</h3>
<p>
歡迎幫忙改善指南的品質。
</p>
<p>
如發現任何錯誤之處,歡迎修正。開始貢獻前,可以先閱讀<a href="http://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html#contributing-to-the-rails-documentation">貢獻指南:文件</a>。
</p>
<p>翻譯如有錯誤,深感抱歉,歡迎 <a href="https://github.com/docrails-tw/guides/fork">Fork</a> 修正,或至此處<a href="https://github.com/docsrails-tw/guides/issues/new">回報</a>。</p>
<p>
文章可能有未完成或過時的內容。請先檢查 <a href="http://edgeguides.rubyonrails.org">Edge Guides</a> 來確定問題在 master 是否已經修掉了。再上 master 補上缺少的文件。內容參考 <a href="ruby_on_rails_guides_guidelines.html">Ruby on Rails 指南準則</a>來了解行文風格。
</p>
<p>最後,任何關於 Ruby on Rails 文件的討論,歡迎至 <a href="http://groups.google.com/group/rubyonrails-docs">rubyonrails-docs 郵件論壇</a>。
</p>
</div>
</div>
</div>
<hr class="hide">
<div id="footer">
<div class="wrapper">
<p>本著作係採用<a href="https://creativecommons.org/licenses/by-sa/4.0/deed.zh_TW">創用 CC 姓名標示-相同方式分享 4.0 國際授權條款</a>授權。</p>
<p>“Rails”、“Ruby on Rails”,以及 Rails logo 為 David Heinemeier Hansson 的商標。版權所有。</p>
</div>
</div>
<script src="javascripts/jquery.min.js"></script>
<script src="javascripts/responsive-tables.js"></script>
<script src="javascripts/guides.js"></script>
<script src="javascripts/syntaxhighlighter/shCore.js"></script>
<script src="javascripts/syntaxhighlighter/shBrushRuby.js"></script>
<script src="javascripts/syntaxhighlighter/shBrushXml.js"></script>
<script src="javascripts/syntaxhighlighter/shBrushSql.js"></script>
<script src="javascripts/syntaxhighlighter/shBrushPlain.js"></script>
<script type="text/javascript">
SyntaxHighlighter.all();
$(guidesIndex.bind);
</script>
<script>
(function(i,s,o,g,r,a,m){i["GoogleAnalyticsObject"]=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,"script","//www.google-analytics.com/analytics.js","ga");
ga("create", "UA-49903900-1", "auto");
ga("require", "displayfeatures");
ga("send", "pageview");
</script>
</body>
</html>