-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path4_1_release_notes.html
638 lines (594 loc) · 43.7 KB
/
4_1_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
<!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.1 发布记 — 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.1 发布记</h2><p>Rails 4.1 精华摘要:</p>
<ul>
<li>采用 Spring 来预载应用程序</li>
<li><code>config/secrets.yml</code></li>
<li>Action Pack Variants</li>
<li>Action Mailer 预览</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.1">升级至 Rails 4.1</a></li>
<li>
<a href="#%E4%B8%BB%E8%A6%81%E7%89%B9%E6%80%A7">主要特性</a>
<ul>
<li><a href="#spring-%E9%A2%84%E5%8A%A0%E8%BD%BD%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F">Spring 预加载应用程序</a></li>
<li><a href="#config/secrets.yml"><code>config/secrets.yml</code></a></li>
<li><a href="#action-pack-variants">Action Pack Variants</a></li>
<li><a href="#action-mailer-%E9%A2%84%E8%A7%88">Action Mailer 预览</a></li>
<li><a href="#active-record-enums">Active Record enums</a></li>
<li><a href="#message-verifiers-%E4%BF%A1%E6%81%AF%E9%AA%8C%E8%AF%81%E5%99%A8">Message verifiers 信息验证器</a></li>
<li><a href="#module#concerning">Module#concerning</a></li>
<li><a href="#csrf-protection-from-remote-%3Cscript%3E-tags">CSRF protection from remote <code><script></code> tags</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%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%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%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-%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="#active-support-%E7%A7%BB%E9%99%A4">移除</a></li>
<li><a href="#%E5%BC%83%E7%94%A8">弃用</a></li>
<li><a href="#active-support-%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.1">1 升级至 Rails 4.1</h3><p>如果你正试著升级现有的应用程序至 Rails 4.1,最好有广的测试覆盖度。首先应先升级至 4.0,再升上 4.1。升级需要注意的事项在此篇 <a href="/guides/edge-translation/upgrading-ruby-on-rails-zh_CN.md#">Ruby on Rails 升级指南</a>可以找到。</p><h3 id="主要特性">2 主要特性</h3><h4 id="spring-预加载应用程序">2.1 Spring 预加载应用程序</h4><p>Spring 预加载你的 Rails 应用程序。保持应用程序在后台运行,如此一来运行 Rails 命令时:如测试、<code>rake</code>、<code>migrate</code> 不用每次都重启 Rails 应用程序,加速你的开发流程。</p><p>新版 Rails 4.1 应用程序出厂内建 “Spring 化” 的 binstubs(aka,运行文件,如 <code>rails</code>、<code>rake</code>)。这表示 <code>bin/rails</code>、<code>bin/rake</code> 会自动采用 Spring 预载的环境。</p><p><strong>运行 rake 任务:</strong></p><div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
bin/rake test:models
</pre>
</div>
<p><strong>运行 console:</strong></p><div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
bin/rails console
</pre>
</div>
<p><strong>查看 Spring</strong></p><div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
$ bin/spring status
Spring is running:
1182 spring server | my_app | started 29 mins ago
3656 spring app | my_app | started 23 secs ago | test mode
3746 spring app | my_app | started 10 secs ago | development mode
</pre>
</div>
<p>请查阅 <a href="https://github.com/jonleighton/spring/blob/master/README.md">Spring README</a> 了解所有特性。</p><p>参考 <a href="/guides/edge-translation/upgrading-ruby-on-rails-zh_TW.md#spring">Ruby on Rails 升级指南</a> 来了解如何在 Rails 4.1 以下使用此特性。</p><h4 id="config/secrets.yml">2.2 <code>config/secrets.yml</code>
</h4><p>Rails 4.1 会在 <code>config/</code> 目录下产生新的 <code>secrets.yml</code>。这个文件默认存有应用程序的 <code>secret_key_base</code>,也可以用来存放其它 secrets,比如存放外部 API 需要用的 access keys。例子:</p><p><code>secrets.yml</code>:</p><div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
development:
secret_key_base: "3b7cd727ee24e8444053437c36cc66c3"
some_api_key: "b2c299a4a7b2fe41b6b7ddf517604a1c34"
</pre>
</div>
<p>读取:</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
> Rails.application.secrets
=> "3b7cd727ee24e8444053437c36cc66c3"
> Rails.application.secrets.some_api_key
=> "SOMEKEY"
</pre>
</div>
<p>参考 <a href="/guides/edge-translation/upgrading-ruby-on-rails-zh_TW.md#config-secrets-yml">Ruby on Rails 升级指南</a> 来了解如何在 Rails 4.1 以下使用此特性。</p><h4 id="action-pack-variants">2.3 Action Pack Variants</h4><p>针对手机、平板、桌上型电脑及浏览器,常需要 <code>render</code> 不同格式的模版:<code>html</code>、<code>json</code>、<code>xml</code>。</p><p><strong>Variant 简化了这件事。</strong></p><p>Request variant 是一种特殊的 request 格式,像是 <code>:tablet</code>、<code>:phone</code> 或 <code>:desktop</code>。</p><p>可在 <code>before_action</code> 里配置 Variant:</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
request.variant = :tablet if request.user_agent =~ /iPad/
</pre>
</div>
<p>在 Controller <code>action</code> 里,回应特殊格式跟处理别的格式相同:</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
respond_to do |format|
format.html do |html|
html.tablet # 会 render app/views/projects/show.html+tablet.erb
html.phone { extra_setup; render ... }
end
end
</pre>
</div>
<p>再给每个特殊格式提供对应的模版:</p><div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
app/views/projects/show.html.erb
app/views/projects/show.html+tablet.erb
app/views/projects/show.html+phone.erb
</pre>
</div>
<p>Variant 定义可以用 inline 写法来简化:</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
respond_to do |format|
format.js { render "trash" }
format.html.phone { redirect_to progress_path }
format.html.none { render "trash" }
end
</pre>
</div>
<h4 id="action-mailer-预览">2.4 Action Mailer 预览</h4><p>Action Mailer Preview 提供你访问特定 URL 来预览 Email 的特性,假设你有个 <code>Notifier</code> Mailer,首先实现预览 <code>Notifier</code> 用的类:</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
class NotifierPreview < ActionMailer::Preview
def welcome
Notifier.welcome(User.first)
end
end
</pre>
</div>
<p>如此一来便可访问 <a href="http://localhost:3000/rails/mailers/notifier/welcome">http://localhost:3000/rails/mailers/notifier/welcome</a> 来预览 Email。</p><p>所有可预览的 Email 可在此找到:<a href="http://localhost:3000/rails/mailers">http://localhost:3000/rails/mailers</a></p><p>默认 preview 类的文件保存在 <code>test/mailers/previews</code>、可以通过 <code>preview_path</code> 选项来配置。</p><p>参见 <a href="http://api.rubyonrails.org/v4.1.0/classes/ActionMailer/Base.html">Action Mailer 的文件</a>来了解更多细节。</p><h4 id="active-record-enums">2.5 Active Record enums</h4><p>设置一个 <code>enum</code> 属性,将属性映射到数据库的整数,并可通过名字查询出来:</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
class Conversation < ActiveRecord::Base
enum status: [ :active, :archived ]
end
conversation.archived!
conversation.active? # => false
conversation.status # => "archived"
Conversation.archived # => Relation for all archived Conversations
</pre>
</div>
<p>参见 <a href="http://api.rubyonrails.org/v4.1.0/classes/ActiveRecord/Enum.html">active_record/enum.rb</a> 来了解更多细节。</p><h4 id="message-verifiers-信息验证器">2.6 Message verifiers 信息验证器</h4><p>信息验证器用来生成和校验签名信息,可以用来保障敏感数据(如记住我口令,朋友数据)传输的安全性。</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
signed_token = Rails.application.message_verifier(:remember_me).generate(token)
Rails.application.message_verifier(:remember_me).verify(signed_token) # => token
Rails.application.message_verifier(:remember_me).verify(tampered_token)
# 抛出异常 ActiveSupport::MessageVerifier::InvalidSignature
</pre>
</div>
<h4 id="module#concerning">2.7 Module#concerning</h4><p>一种更自然,轻量级的拆分类特性的方式:</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
class Todo < ActiveRecord::Base
concerning :EventTracking do
included do
has_many :events
end
def latest_event
...
end
private
def some_internal_method
...
end
end
end
</pre>
</div>
<p>等同于以前要定义 <code>EventTracking</code> Module,<code>extend ActiveSupport::Concern</code>,再混入 (mixin) <code>Todo</code> 类。</p><p>参见 <a href="http://api.rubyonrails.org/v4.1.0/classes/Module/Concerning.html">Module#concerning</a> 来了解更多细节。</p><h4 id="csrf-protection-from-remote-<script>-tags">2.8 CSRF protection from remote <code><script></code> tags</h4><p>Rails 的跨站伪造请求(CSRF)防护机制现在也会保护从第三方 JavaScript 来的 GET 请求了!这预防第三方网站运行你的 JavaScript,试图窃取敏感资料。</p><p>这代表任何访问 <code>.js</code> URL 的测试会失败,除非你明确指定使用 <code>xhr</code> (<code>XmlHttpRequests</code>)。</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
post :create, format: :js
</pre>
</div>
<p>改写为</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
xhr :post, :create, format: :js
</pre>
</div>
<h3 id="railties">3 Railties</h3><p>请参考 [Changelog][Railties-CHANGELOG] 来了解更多细节。</p><h4 id="railties-移除">3.1 移除</h4>
<ul>
<li><p>移除了 <code>update:application_controller</code> rake 任务。</p></li>
<li><p>移除了 <code>Rails.application.railties.engines</code>。</p></li>
<li><p>Rails 移除了 <code>config.threadsafe!</code> 配置。</p></li>
<li><p>移除了 <code>ActiveRecord::Generators::ActiveModel#update_attributes</code>,
请改用 <code>ActiveRecord::Generators::ActiveModel#update</code>。</p></li>
<li><p>移除了 <code>config.whiny_nils</code> 配置。</p></li>
<li><p>移除了用来跑测试的两个 task:<code>rake test:uncommitted</code> 与 <code>rake test:recent</code>。</p></li>
</ul>
<h4 id="railties-值得一提的变化">3.2 值得一提的变化</h4>
<ul>
<li><p><a href="https://github.com/jonleighton/spring">Spring</a> 纳入默认 Gem,列在 <code>Gemfile</code>
的 <code>group :development</code> 里,所以 production 环境不会安装。<a href="https://github.com/rails/rails/pull/12958">PR#12958</a></p></li>
<li><p><code>BACKTRACE</code> 环境变量可看(unfiltered)测试的 backtrace。<a href="https://github.com/rails/rails/commit/84eac5dab8b0fe9ee20b51250e52ad7bfea36553">Commit</a></p></li>
<li><p>可以在环境配置文件配置 <code>MiddlewareStack#unshift</code>。 <a href="https://github.com/rails/rails/pull/12749">PR#12749</a></p></li>
<li><p>新增 <code>Application#message_verifier</code> 方法来返回消息验证器。<a href="https://github.com/rails/rails/pull/12995">PR#12995</a></p></li>
<li><p>默认生成的 <code>test_helper.rb</code> 会 <code>require</code> <code>test_help.rb</code>,帮你把测试的数据库与 <code>db/schema.rb</code>(或 <code>db/structure.sql</code>)同步。但发现尚未迁移的 migration 与 schema 不一致时会抛出错误。错误抛出与否:<code>config.active_record.maintain_test_schema = false</code>,参见此<a href="https://github.com/rails/rails/pull/13528">PR#13528</a>。</p></li>
</ul>
<h3 id="action-pack">4 Action Pack</h3><p>请参考 [Changelog][AP-CHANGELOG] 来了解更多细节。</p><h4 id="action-pack-移除">4.1 移除</h4>
<ul>
<li><p>移除了 Rails 针对整合测试的补救方案(fallback),请配置 <code>ActionDispatch.test_app</code>。</p></li>
<li><p>移除了 <code>config.page_cache_extension</code> 配置。</p></li>
<li><p>移除了 <code>ActionController::RecordIdentifier</code>,请改用 <code>ActionView::RecordIdentifier</code>。</p></li>
<li>
<p>更改 Action Controller 下列常量的名称:</p>
<table>
<thead>
<tr>
<th style="text-align: left">移除</th>
<th style="text-align: left">采用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left">ActionController::AbstractRequest</td>
<td style="text-align: left">ActionDispatch::Request</td>
</tr>
<tr>
<td style="text-align: left">ActionController::Request</td>
<td style="text-align: left">ActionDispatch::Request</td>
</tr>
<tr>
<td style="text-align: left">ActionController::AbstractResponse</td>
<td style="text-align: left">ActionDispatch::Response</td>
</tr>
<tr>
<td style="text-align: left">ActionController::Response</td>
<td style="text-align: left">ActionDispatch::Response</td>
</tr>
<tr>
<td style="text-align: left">ActionController::Routing</td>
<td style="text-align: left">ActionDispatch::Routing</td>
</tr>
<tr>
<td style="text-align: left">ActionController::Integration</td>
<td style="text-align: left">ActionDispatch::Integration</td>
</tr>
<tr>
<td style="text-align: left">ActionController::IntegrationTest</td>
<td style="text-align: left">ActionDispatch::IntegrationTest</td>
</tr>
</tbody>
</table>
</li>
</ul>
<h4 id="action-pack-值得一提的变化">4.2 值得一提的变化</h4>
<ul>
<li><p><code>protect_from_forgery</code> 现在也会预防跨站的 <code><script></code>。请更新测试,使用 <code>xhr :get, :foo, format: :js</code> 来取代 <code>get :foo, format: :js</code>。<a href="https://github.com/rails/rails/pull/13345">PR#13345</a></p></li>
<li><p><code>#url_for</code> 接受额外的 options,可将选项打包成 hash,放在数组传入。<a href="https://github.com/rails/rails/pull/9599">PR#9599</a></p></li>
<li><p>新增 <code>session#fetch</code> 方法,行为与 <a href="http://www.ruby-doc.org/core-2.0.0/Hash.html#method-i-fetch">Hash#fetch</a> 类似,差别在返回值永远会存回 session。 <a href="https://github.com/rails/rails/pull/12692">PR#12692</a></p></li>
<li><p>将 Action View 从 Action Pack 里整个拿掉。 <a href="https://github.com/rails/rails/pull/11032">PR#11032</a></p></li>
</ul>
<h3 id="action-mailer">5 Action Mailer</h3><p>请参考 <a href="https://github.com/rails/rails/blob/4-1-stable/actionmailer/CHANGELOG.md">Changelog</a> 来了解更多细节。</p><h4 id="action-mailer-值得一提的变化">5.1 值得一提的变化</h4>
<ul>
<li> Action Mailer 产生 mail 的时间会写到 log 里。 <a href="https://github.com/rails/rails/pull/12556">PR#12556</a>
</li>
</ul>
<h3 id="active-record">6 Active Record</h3><p>请参考 [Changelog][AR-CHANGELOG] 来了解更多细节。</p><h4 id="active-record-移除">6.1 移除</h4>
<ul>
<li><p>移除了传入 <code>nil</code> 至右列 <code>SchemaCache</code> 的方法:<code>primary_keys</code>、<code>tables</code>、<code>columns</code> 及 <code>columns_hash</code>。</p></li>
<li><p>从 <code>ActiveRecord::Migrator#migrate</code> 移除了 block filter。</p></li>
<li><p>从 <code>ActiveRecord::Migrator</code> 移除了 String constructor。</p></li>
<li><p>移除了 scope 没传 callable object 的用法。</p></li>
<li><p>移除了 <code>transaction_joinable=</code>,请改用 <code>begin_transaction</code> 加 <code>:joinable</code> 选项的组合。</p></li>
<li><p>移除了 <code>decrement_open_transactions</code>。</p></li>
<li><p>移除了 <code>increment_open_transactions</code>。</p></li>
<li><p>移除了 <code>PostgreSQLAdapter#outside_transaction?</code>,可用 <code>#transaction_open?</code> 来取代。</p></li>
<li><p>移除了 <code>ActiveRecord::Fixtures.find_table_name</code> 请改用 <code>ActiveRecord::Fixtures.default_fixture_model_name</code>。</p></li>
<li><p>从 <code>SchemaStatements</code> 移除了 <code>columns_for_remove</code>。</p></li>
<li><p>移除了 <code>SchemaStatements#distinct</code>。</p></li>
<li><p>将弃用的 <code>ActiveRecord::TestCase</code> 移到 Rails test 里。</p></li>
<li><p>移除有 <code>:dependent</code> 选项的关联传入 <code>:restrict</code> 选项。</p></li>
<li><p>移除了 association 这几个选项 <code>:delete_sql</code>、<code>:insert_sql</code>、<code>:finder_sql</code> 及 <code>:counter_sql</code>。</p></li>
<li><p>从 Column 移除了 <code>type_cast_code</code> 方法。</p></li>
<li><p>移除了 <code>ActiveRecord::Base#connection</code> 实体方法,请透过 Class 来使用。</p></li>
<li><p>移除了 <code>auto_explain_threshold_in_seconds</code> 的警告。</p></li>
<li><p>移除了 <code>Relation#count</code> 的 <code>:distinct</code> 选项。</p></li>
<li><p>移除了 <code>partial_updates</code>、<code>partial_updates?</code> 与 <code>partial_updates=</code>。</p></li>
<li><p>移除了 <code>scoped</code>。</p></li>
<li><p>移除了 <code>default_scopes?</code>。</p></li>
<li><p>移除了隐式的 join references。</p></li>
<li><p>移掉 <code>activerecord-deprecated_finders</code> gem 的相依性。</p></li>
<li><p>移除了 <code>implicit_readonly</code>。请改用 <code>readonly</code> 方法,并将 record 明确标明为 <code>readonly</code>。 <a href="https://github.com/rails/rails/pull/10769">PR#10769</a></p></li>
</ul>
<h4 id="active-record-弃用">6.2 弃用</h4>
<ul>
<li><p>弃用了任何地方都没用到的 <code>quoted_locking_column</code> 方法。</p></li>
<li><p>弃用了 association 从 Array 获得的 bang 方法。要使用请先将 association 转成数组(<code>#to_a</code>),再对元素做处理。 <a href="https://github.com/rails/rails/pull/12129">PR#12129</a>。</p></li>
<li><p>Rails 内部弃用了 <code>ConnectionAdapters::SchemaStatements#distinct</code>。 <a href="https://github.com/rails/rails/pull/10556">PR#10556</a></p></li>
<li><p>弃用 <code>rake db:test:*</code> 系列的任务,因为现在会自动配置好测试数据库。参见 Railties 的发布记。<a href="https://github.com/rails/rails/pull/13528">PR#13528</a></p></li>
<li><p>弃用了无用的 <code>ActiveRecord::Base.symbolized_base_class</code> 与 <code>ActiveRecord::Base.symbolized_sti_name</code> 且没有替代方案。<a href="https://github.com/rails/rails/commit/97e7ca48c139ea5cce2fa9b4be631946252a1ebd">Commit</a></p></li>
</ul>
<h4 id="active-record-值得一提的变化">6.3 值得一提的变化</h4>
<ul>
<li><p>新增 <code>ActiveRecord::Base.to_param</code> 来显示漂亮的 URL。 <a href="https://github.com/rails/rails/pull/12891">PR#12891</a></p></li>
<li><p>新增 <code>ActiveRecord::Base.no_touching</code>,可允许忽略对 Model 的 touch。 <a href="https://github.com/rails/rails/pull/12772">PR#12772</a></p></li>
<li><p>统一了 <code>MysqlAdapter</code> 与 <code>Mysql2Adapter</code> 的布尔转换,<code>true</code> 会返回 <code>1</code>,<code>false</code> 返回 <code>0</code>。 <a href="https://github.com/rails/rails/pull/12425">PR#12425</a></p></li>
<li><p><code>unscope</code> 现在移除了 <code>default_scope</code> 规范的 conditions。<a href="https://github.com/rails/rails/commit/94924dc32baf78f13e289172534c2e71c9c8cade">Commit</a></p></li>
<li><p>新增 <code>ActiveRecord::QueryMethods#rewhere</code>,会覆写已存在的 where 条件。<a href="https://github.com/rails/rails/commit/f950b2699f97749ef706c6939a84dfc85f0b05f2">Commit</a></p></li>
<li><p>扩充了 <code>ActiveRecord::Base#cache_key</code>,可接受多个 timestamp,会使用数值最大的 timestamp。<a href="https://github.com/rails/rails/commit/e94e97ca796c0759d8fcb8f946a3bbc60252d329">Commit</a></p></li>
<li><p>新增 <code>ActiveRecord::Base#enum</code>,用来枚举 attributes。将 attributes 映射到数据库的整数,并可透过名字查询出来。<a href="https://github.com/rails/rails/commit/db41eb8a6ea88b854bf5cd11070ea4245e1639c5">Commit</a></p></li>
<li><p>写入数据库时,JSON 会做类型转换。这样子读写才会一致。 <a href="https://github.com/rails/rails/pull/12643">PR#12643</a></p></li>
<li><p>写入数据库时,hstore 会做类型转换,这样子读写才会一致。<a href="https://github.com/rails/rails/commit/5ac2341fab689344991b2a4817bd2bc8b3edac9d">Commit</a></p></li>
<li><p><code>next_migration_number</code> 可供第三方函式库存取。 <a href="https://github.com/rails/rails/pull/12407">PR#12407</a></p></li>
<li><p>若是调用 <code>update_attributes</code> 的参数有 <code>nil</code>,则会抛出 <code>ArgumentError</code>。更精准的说,传进来的参数,没有回应(<code>respond_to</code>) <code>stringify_keys</code> 的话,会抛出错误。<a href="https://github.com/rails/rails/pull/9860">PR#9860</a></p></li>
<li><p><code>CollectionAssociation#first</code>/<code>#last</code> (<code>has_many</code>) ,Query 会使用 <code>LIMIT</code> 来限制提取的数量,而不是将整个 collection 载入出来。 <a href="https://github.com/rails/rails/pull/12137">PR#12137</a></p></li>
<li><p>对 Active Record Model 的类别做 <code>inspect</code> 不会去连数据库。这样当数据库不存在时,<code>inspect</code> 才不会喷错误。<a href="https://github.com/rails/rails/pull/11014">PR#11014</a></p></li>
<li><p>移除了 <code>count</code> 的列限制,SQL 不正确时,让数据库自己丢出错误。 <a href="https://github.com/rails/rails/pull/10710">PR#10710</a></p></li>
<li><p>Rails 现在会自动侦测 inverse associations。如果 association 没有配置 <code>:inverse_of</code>,则 Active Record 会自己猜出对应的 associaiton。<a href="https://github.com/rails/rails/pull/10886">PR#10886</a></p></li>
<li><p><code>ActiveRecord::Relation</code> 会处理有别名的 attributes。当使用符号作为 key 时,Active Record 现在也会一起翻译别名的属性了,将其转成数据库内所使用的列名。<a href="https://github.com/rails/rails/pull/7839">PR#7839</a></p></li>
<li><p>Fixtures 文件中的 ERB 不在 main 对象上下文里执行了,多个 fixtures 使用的 Helper 方法,需要定义在被 <code>ActiveRecord::FixtureSet.context_class</code> 包含的模块里。<a href="https://github.com/rails/rails/pull/13022">PR#13022</a></p></li>
<li><p>若是明确指定了 <code>RAILS_ENV</code>,则不要建立与删除数据库。</p></li>
</ul>
<h3 id="active-model">7 Active Model</h3><p>请参考 [Changelog][AM-CHANGELOG] 来了解更多细节。</p><h4 id="active-model-弃用">7.1 弃用</h4>
<ul>
<li>弃用了 <code>Validator#setup</code>。现在要手动在 Validator 的 constructor 里处理。<a href="https://github.com/rails/rails/commit/7d84c3a2f7ede0e8d04540e9c0640de7378e9b3a">Commit</a>
</li>
</ul>
<h4 id="active-model-值得一提的变化">7.2 值得一提的变化</h4>
<ul>
<li>
<code>ActiveModel::Dirty</code> 加入新的 API:<code>reset_changes</code> 与 <code>changes_applied</code>,来控制改变的状态。</li>
</ul>
<h3 id="active-support">8 Active Support</h3><p>请参考 <a href="https://github.com/rails/rails/blob/4-1-stable/activesupport/CHANGELOG.md">Changelog</a> 来了解更多细节。</p><h4 id="active-support-移除">8.1 移除</h4>
<ul>
<li><p>移除对 <code>MultiJSON</code> Gem 的依赖。也就是说 <code>ActiveSupport::JSON.decode</code> 不再接受给 <code>MultiJSON</code> 的 hash 参数。<a href="https://github.com/rails/rails/pull/10576">PR#10576</a></p></li>
<li><p>移除了 <code>encode_json</code> hook,本来可以用来把 object 转成 JSON。这个特性被抽成了 <a href="https://github.com/rails/activesupport-json_encoder">activesupport-json_encoder</a> Gem,请参考 <a href="https://github.com/rails/rails/pull/12183">PR#12183</a> 与<a href="upgrading_ruby_on_rails.html#changes-in-json-handling">这里</a>。</p></li>
<li><p>移除了 <code>ActiveSupport::JSON::Variable</code>。</p></li>
<li><p>移除了 <code>String#encoding_aware?</code>(<code>core_ext/string/encoding.rb</code>)。</p></li>
<li><p>移除了 <code>Module#local_constant_names</code> 请改用 <code>Module#local_constants</code>。</p></li>
<li><p>移除了 <code>DateTime.local_offset</code> 请改用 <code>DateTime.civil_from_format</code>。</p></li>
<li><p>移除了 <code>Logger</code> (<code>core_ext/logger.rb</code>)。</p></li>
<li><p>移除了 <code>Time#time_with_datetime_fallback</code>、<code>Time#utc_time</code> 与
<code>Time#local_time</code>,请改用 <code>Time#utc</code> 与 <code>Time#local</code>。</p></li>
<li><p>移除了 <code>Hash#diff</code>。</p></li>
<li><p>移除了 <code>Date#to_time_in_current_zone</code> 请改用 <code>Date#in_time_zone</code>。</p></li>
<li><p>移除了 <code>Proc#bind</code>。</p></li>
<li><p>移除了 <code>Array#uniq_by</code> 与 <code>Array#uniq_by!</code> 请改用 Ruby 原生的
<code>Array#uniq</code> 与 <code>Array#uniq!</code>。</p></li>
<li><p>移除了 <code>ActiveSupport::BasicObject</code> 请改用 <code>ActiveSupport::ProxyObject</code>。</p></li>
<li><p>移除了 <code>BufferedLogger</code>, 请改用 <code>ActiveSupport::Logger</code>。</p></li>
<li><p>移除了 <code>assert_present</code> 与 <code>assert_blank</code>,请改用 <code>assert
object.blank?</code> 与 <code>assert object.present?</code>。</p></li>
</ul>
<h4 id="弃用">8.2 弃用</h4>
<ul>
<li><p>弃用了 <code>Numeric#{ago,until,since,from_now}</code>,要明确的将数值转成 <code>AS::Duration</code>。比如 <code>5.ago</code> 请改成 <code>5.seconds.ago</code>。 <a href="https://github.com/rails/rails/pull/12389">PR#12389</a></p></li>
<li><p>引用路径里弃用了 <code>active_support/core_ext/object/to_json</code>. 请引用 <code>active_support/core_ext/object/json instead</code> <a href="https://github.com/rails/rails/pull/12203">PR#12203</a></p></li>
<li><p>弃用了 <code>ActiveSupport::JSON::Encoding::CircularReferenceError</code>。 这个特性被抽成了 <a href="https://github.com/rails/activesupport-json_encoder">activesupport-json_encoder</a> Gem,请参考 <a href="https://github.com/rails/rails/pull/12183">PR#12183</a> 与<a href="upgrading_ruby_on_rails.html#changes-in-json-handling">这里</a>。</p></li>
<li><p>弃用了 <code>ActiveSupport.encode_big_decimal_as_string</code> 选项。 这个特性被抽成了 <a href="https://github.com/rails/activesupport-json_encoder">activesupport-json_encoder</a> Gem,请参考 <a href="https://github.com/rails/rails/pull/12183">PR#12183</a> 与<a href="upgrading_ruby_on_rails.html#changes-in-json-handling">这里</a>。</p></li>
</ul>
<h4 id="active-support-值得一提的变化">8.3 值得一提的变化</h4>
<ul>
<li><p>使用 JSON gem 重写 ActiveSupport 的 JSON 编码部分,提升了纯 Ruby 定制编码的效率。参考 <a href="https://github.com/rails/rails/pull/12183">PR#12183</a> 与<a href="http://edgeguides.rubyonrails.org/upgrading_ruby_on_rails.html#changes-in-json-handling">这里</a>。</p></li>
<li><p>提升 JSON gem 兼容性。 <a href="https://github.com/rails/rails/pull/12862">PR#12862</a> 与<a href="http://edgeguides.rubyonrails.org/upgrading_ruby_on_rails.html#changes-in-json-handling">这里</a></p></li>
<li><p>新增 <code>ActiveSupport::Testing::TimeHelpers#travel</code> 与 <code>#travel_to</code>。这两个方法通过 stubbing <code>Time.now</code> 与 <code>Date.today</code>,可设置任意时间,做时光旅行。参考 <a href="https://github.com/rails/rails/pull/12824">PR#12824</a></p></li>
<li><p>新增 <code>Numeric#in_milliseconds</code>,像是 1 小时有几毫秒:<code>1.hour.in_milliseconds</code>。可以将时间转成毫秒,再传给 JavaScript 的 <code>getTime()</code> 函数。<a href="https://github.com/rails/rails/commit/423249504a2b468d7a273cbe6accf4f21cb0e643">Commit</a></p></li>
<li><p>新增了 <code>Date#middle_of_day</code>、<code>DateTime#middle_of_day</code> 与 <code>Time#middle_of_day</code>
方法。同时添加了 <code>midday</code>、<code>noon</code>、<code>at_midday</code>、<code>at_noon</code>、<code>at_middle_of_day</code> 作为别名。<a href="https://github.com/rails/rails/pull/10879">PR#10879</a></p></li>
<li><p><code>String#gsub(pattern,'')</code> 可简写为 <code>String#remove(pattern)</code>。<a href="https://github.com/rails/rails/commit/5da23a3f921f0a4a3139495d2779ab0d3bd4cb5f">Commit</a></p></li>
<li><p>移除了 <code>'cow'</code> => <code>'kine'</code> 这个不规则的转换。<a href="https://github.com/rails/rails/commit/c300dca9963bda78b8f358dbcb59cabcdc5e1dc9">Commit</a></p></li>
</ul>
<h3 id="致谢">9 致谢</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>