-
Notifications
You must be signed in to change notification settings - Fork 2
/
4_2_release_notes.html
838 lines (781 loc) · 54.7 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
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Ruby on Rails 4.2 发布记 — Ruby on Rails 指南</title>
<link rel="stylesheet" type="text/css" href="stylesheets/style.css" />
<link rel="stylesheet" type="text/css" href="stylesheets/print.css" media="print" />
<link rel="stylesheet" type="text/css" href="stylesheets/syntaxhighlighter/shCore.css" />
<link rel="stylesheet" type="text/css" href="stylesheets/syntaxhighlighter/shThemeRailsGuides.css" />
<link rel="stylesheet" type="text/css" href="stylesheets/fixes.css" />
<link href="images/favicon.ico" rel="shortcut icon" type="image/x-icon" />
</head>
<body class="guide">
<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>模型</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>视图</dt>
<dd><a href="layouts_and_rendering.html">Rails 布局和视图渲染</a></dd>
<dd><a href="form_helpers.html">Action View 表单帮助方法</a></dd>
<dt>控制器</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">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>
</dl>
</div>
</li>
<!-- <li><a class="nav-item" href="//github.com/docrails-tw/wiki">参与翻译</a></li> -->
<li><a class="nav-item" href="https://github.com/ruby-china/guides/blob/master/CONTRIBUTING.md">贡献</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="模型">
<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="视图">
<option value="layouts_and_rendering.html">Rails 布局和视图渲染</option>
<option value="form_helpers.html">Action View 表单帮助方法</option>
</optgroup>
<optgroup label="控制器">
<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">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>
</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 终端</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%BA%A7%E8%87%B3-rails-4.2">升级至 Rails 4.2</a></li>
<li>
<a href="#%E9%87%8D%E8%A6%81%E6%96%B0%E7%89%B9%E6%80%A7">重要新特性</a>
<ul>
<li><a href="#active-job">Active Job</a></li>
<li><a href="#%E5%BC%82%E6%AD%A5%E9%82%AE%E4%BB%B6">异步邮件</a></li>
<li><a href="#adequate-record">Adequate Record</a></li>
<li><a href="#web-%E7%BB%88%E7%AB%AF">Web 终端</a></li>
<li><a href="#%E5%A4%96%E9%94%AE%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%E5%85%BC%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%82%E6%95%B0"><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%E7%BC%BA%E7%9C%81%E4%B8%BB%E6%9C%BA%EF%BC%88host%EF%BC%89%E5%8F%98%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-%E5%BC%83%E7%94%A8">弃用</a></li>
<li><a href="#railties-%E5%80%BC%E5%BE%97%E4%B8%80%E6%8F%90%E7%9A%84%E5%8F%98%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-%E5%BC%83%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%E5%8F%98%E5%8C%96">值得一提的变化</a></li>
</ul>
</li>
<li>
<a href="#action-view">Action View</a>
<ul>
<li><a href="#action-view-%E5%BC%83%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%E5%8F%98%E5%8C%96">值得一提的变化</a></li>
</ul>
</li>
<li>
<a href="#action-mailer">Action Mailer</a>
<ul>
<li><a href="#action-mailer-%E5%BC%83%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%E5%8F%98%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-%E5%BC%83%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%E5%8F%98%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-%E5%BC%83%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%E5%8F%98%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="#%E5%BC%83%E7%94%A8">弃用</a></li>
<li><a href="#%E5%80%BC%E5%BE%97%E4%B8%80%E6%8F%90%E7%9A%84%E5%8F%98%E5%8C%96">值得一提的变化</a></li>
</ul>
</li>
<li><a href="#%E8%87%B4%E8%B0%A2">致谢</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> 视图帮助方法到任何页面,便可以在页面的上下文里,在页面渲染结束后启动一个互动式的终端。</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> 的适配器支持外键。</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 action 调用 <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> 生产环境新增 <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 用来产生关联的 generator 添加 <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> 脚本来启动(bootstrapping)应用。
(<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 现在会带有控制器和动作名称。
(<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>。想修改寻找视图的位置,
请覆盖 <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><div></code> 元素。
(<a href="https://github.com/rails/rails/pull/14738">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> Placeholder I18n 遵循和 <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>.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 Object。
(<a href="https://github.com/rails/rails/pull/15878">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>.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> <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> <code>ActiveRecord::Base#reload</code> 现在的行为同 <code>m = Model.find(m.id)</code>,代表不再给自定的
<code>select</code> 保存额外的属性。
(<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/ruby-china/guides/fork">Fork</a> 修正,或至此处<a href="https://github.com/ruby-china/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/">创用 CC 姓名标示-相同方式分享 4.0 国际授权条款</a>授权。</p>
<p>“Rails”、“Ruby on Rails”,以及 Rails logo 为 David Heinemeier Hansson 的商标。版权所有。</p>
</div>
</div>
<script type="text/javascript" src="javascripts/jquery.min.js"></script>
<script type="text/javascript" src="javascripts/responsive-tables.js"></script>
<script type="text/javascript" src="javascripts/guides.js"></script>
<script type="text/javascript" src="javascripts/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="javascripts/syntaxhighlighter/shBrushRuby.js"></script>
<script type="text/javascript" src="javascripts/syntaxhighlighter/shBrushXml.js"></script>
<script type="text/javascript" src="javascripts/syntaxhighlighter/shBrushSql.js"></script>
<script type="text/javascript" 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', '', 'ruby-china.github.io');
ga('require', 'displayfeatures');
ga('send', 'pageview');
</script>
</body>
</html>