rails 4.0.13 → 4.1.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +22 -17
  3. data/guides/CHANGELOG.md +68 -34
  4. data/guides/assets/images/edge_badge.png +0 -0
  5. data/guides/assets/images/feature_tile.gif +0 -0
  6. data/guides/assets/images/footer_tile.gif +0 -0
  7. data/guides/assets/images/fxn.png +0 -0
  8. data/guides/assets/images/getting_started/article_with_comments.png +0 -0
  9. data/guides/assets/images/getting_started/challenge.png +0 -0
  10. data/guides/assets/images/getting_started/confirm_dialog.png +0 -0
  11. data/guides/assets/images/getting_started/forbidden_attributes_for_new_article.png +0 -0
  12. data/guides/assets/images/getting_started/form_with_errors.png +0 -0
  13. data/guides/assets/images/getting_started/index_action_with_edit_link.png +0 -0
  14. data/guides/assets/images/getting_started/new_article.png +0 -0
  15. data/guides/assets/images/getting_started/rails_welcome.png +0 -0
  16. data/guides/assets/images/getting_started/routing_error_no_controller.png +0 -0
  17. data/guides/assets/images/getting_started/routing_error_no_route_matches.png +0 -0
  18. data/guides/assets/images/getting_started/show_action_for_articles.png +0 -0
  19. data/guides/assets/images/getting_started/template_is_missing_articles_new.png +0 -0
  20. data/guides/assets/images/getting_started/unknown_action_create_for_articles.png +0 -0
  21. data/guides/assets/images/getting_started/unknown_action_new_for_articles.png +0 -0
  22. data/guides/assets/images/header_tile.gif +0 -0
  23. data/guides/assets/images/icons/README +1 -1
  24. data/guides/assets/images/icons/callouts/11.png +0 -0
  25. data/guides/assets/images/icons/callouts/12.png +0 -0
  26. data/guides/assets/images/icons/callouts/13.png +0 -0
  27. data/guides/assets/images/icons/callouts/15.png +0 -0
  28. data/guides/assets/images/icons/caution.png +0 -0
  29. data/guides/assets/images/icons/example.png +0 -0
  30. data/guides/assets/images/radar.png +0 -0
  31. data/guides/assets/images/rails4_features.png +0 -0
  32. data/guides/assets/images/rails_guides_kindle_cover.jpg +0 -0
  33. data/guides/assets/images/vijaydev.jpg +0 -0
  34. data/guides/assets/javascripts/guides.js +30 -34
  35. data/guides/assets/stylesheets/main.css +2 -1
  36. data/guides/assets/stylesheets/print.css +1 -1
  37. data/guides/bug_report_templates/action_controller_gem.rb +9 -4
  38. data/guides/bug_report_templates/action_controller_master.rb +4 -2
  39. data/guides/bug_report_templates/active_record_gem.rb +5 -2
  40. data/guides/bug_report_templates/active_record_master.rb +2 -1
  41. data/guides/bug_report_templates/generic_gem.rb +15 -0
  42. data/guides/bug_report_templates/generic_master.rb +26 -0
  43. data/guides/code/getting_started/Gemfile +21 -24
  44. data/guides/code/getting_started/Gemfile.lock +78 -73
  45. data/guides/code/getting_started/Rakefile +1 -1
  46. data/guides/code/getting_started/app/assets/javascripts/application.js +1 -2
  47. data/guides/code/getting_started/app/views/layouts/application.html.erb +2 -2
  48. data/guides/code/getting_started/config/environment.rb +1 -1
  49. data/guides/code/getting_started/config/environments/development.rb +2 -2
  50. data/guides/code/getting_started/config/environments/production.rb +3 -3
  51. data/guides/code/getting_started/config/environments/test.rb +2 -2
  52. data/guides/code/getting_started/config/initializers/secret_token.rb +1 -1
  53. data/guides/code/getting_started/config/initializers/session_store.rb +1 -1
  54. data/guides/code/getting_started/config/routes.rb +1 -1
  55. data/guides/code/getting_started/config.ru +1 -1
  56. data/guides/code/getting_started/public/404.html +2 -0
  57. data/guides/code/getting_started/public/422.html +2 -0
  58. data/guides/code/getting_started/public/500.html +2 -0
  59. data/guides/code/getting_started/test/test_helper.rb +0 -3
  60. data/guides/rails_guides/helpers.rb +3 -1
  61. data/guides/source/2_2_release_notes.md +2 -2
  62. data/guides/source/2_3_release_notes.md +8 -8
  63. data/guides/source/3_0_release_notes.md +2 -3
  64. data/guides/source/3_1_release_notes.md +2 -2
  65. data/guides/source/3_2_release_notes.md +12 -12
  66. data/guides/source/4_0_release_notes.md +79 -46
  67. data/guides/source/4_1_release_notes.md +731 -0
  68. data/guides/source/_welcome.html.erb +5 -2
  69. data/guides/source/action_controller_overview.md +189 -40
  70. data/guides/source/action_mailer_basics.md +27 -27
  71. data/guides/source/action_view_overview.md +131 -20
  72. data/guides/source/active_model_basics.md +6 -6
  73. data/guides/source/active_record_basics.md +15 -15
  74. data/guides/source/active_record_callbacks.md +18 -16
  75. data/guides/source/active_record_querying.md +93 -51
  76. data/guides/source/active_record_validations.md +26 -24
  77. data/guides/source/active_support_core_extensions.md +72 -118
  78. data/guides/source/active_support_instrumentation.md +13 -4
  79. data/guides/source/api_documentation_guidelines.md +104 -6
  80. data/guides/source/asset_pipeline.md +573 -244
  81. data/guides/source/association_basics.md +94 -22
  82. data/guides/source/caching_with_rails.md +15 -6
  83. data/guides/source/command_line.md +55 -46
  84. data/guides/source/configuring.md +248 -52
  85. data/guides/source/contributing_to_ruby_on_rails.md +18 -17
  86. data/guides/source/credits.html.erb +2 -2
  87. data/guides/source/debugging_rails_applications.md +39 -8
  88. data/guides/source/development_dependencies_install.md +91 -8
  89. data/guides/source/documents.yaml +4 -0
  90. data/guides/source/engines.md +678 -232
  91. data/guides/source/form_helpers.md +53 -35
  92. data/guides/source/generators.md +19 -15
  93. data/guides/source/getting_started.md +758 -497
  94. data/guides/source/i18n.md +64 -28
  95. data/guides/source/index.html.erb +1 -1
  96. data/guides/source/initialization.md +155 -58
  97. data/guides/source/kindle/toc.html.erb +1 -1
  98. data/guides/source/layout.html.erb +2 -2
  99. data/guides/source/layouts_and_rendering.md +59 -26
  100. data/guides/source/maintenance_policy.md +3 -3
  101. data/guides/source/migrations.md +101 -62
  102. data/guides/source/nested_model_forms.md +3 -3
  103. data/guides/source/plugins.md +34 -31
  104. data/guides/source/rails_application_templates.md +27 -8
  105. data/guides/source/rails_on_rack.md +41 -58
  106. data/guides/source/routing.md +115 -104
  107. data/guides/source/ruby_on_rails_guides_guidelines.md +2 -2
  108. data/guides/source/security.md +81 -36
  109. data/guides/source/testing.md +56 -79
  110. data/guides/source/upgrading_ruby_on_rails.md +531 -21
  111. data/guides/source/working_with_javascript_in_rails.md +19 -11
  112. metadata +51 -23
  113. data/guides/assets/images/getting_started/forbidden_attributes_for_new_post.png +0 -0
  114. data/guides/assets/images/getting_started/new_post.png +0 -0
  115. data/guides/assets/images/getting_started/post_with_comments.png +0 -0
  116. data/guides/assets/images/getting_started/show_action_for_posts.png +0 -0
  117. data/guides/assets/images/getting_started/template_is_missing_posts_new.png +0 -0
  118. data/guides/assets/images/getting_started/undefined_method_post_path.png +0 -0
  119. data/guides/assets/images/getting_started/unknown_action_create_for_posts.png +0 -0
  120. data/guides/assets/images/getting_started/unknown_action_new_for_posts.png +0 -0
  121. data/guides/assets/images/jaimeiniesta.jpg +0 -0
  122. data/guides/source/kindle/KINDLE.md +0 -26
@@ -3,9 +3,9 @@ The Basics of Creating Rails Plugins
3
3
 
4
4
  A Rails plugin is either an extension or a modification of the core framework. Plugins provide:
5
5
 
6
- * a way for developers to share bleeding-edge ideas without hurting the stable code base
7
- * a segmented architecture so that units of code can be fixed or updated on their own release schedule
8
- * an outlet for the core developers so that they dont have to include every cool new feature under the sun
6
+ * A way for developers to share bleeding-edge ideas without hurting the stable code base.
7
+ * A segmented architecture so that units of code can be fixed or updated on their own release schedule.
8
+ * An outlet for the core developers so that they don't have to include every cool new feature under the sun.
9
9
 
10
10
  After reading this guide, you will know:
11
11
 
@@ -15,7 +15,7 @@ After reading this guide, you will know:
15
15
  This guide describes how to build a test-driven plugin that will:
16
16
 
17
17
  * Extend core Ruby classes like Hash and String.
18
- * Add methods to ActiveRecord::Base in the tradition of the 'acts_as' plugins.
18
+ * Add methods to `ActiveRecord::Base` in the tradition of the `acts_as` plugins.
19
19
  * Give you information about where to put generators in your plugin.
20
20
 
21
21
  For the purpose of this guide pretend for a moment that you are an avid bird watcher.
@@ -39,16 +39,16 @@ to run integration tests using a dummy Rails application. Create your
39
39
  plugin with the command:
40
40
 
41
41
  ```bash
42
- $ rails plugin new yaffle
42
+ $ bin/rails plugin new yaffle
43
43
  ```
44
44
 
45
45
  See usage and options by asking for help:
46
46
 
47
47
  ```bash
48
- $ rails plugin --help
48
+ $ bin/rails plugin --help
49
49
  ```
50
50
 
51
- Testing your newly generated plugin
51
+ Testing Your Newly Generated Plugin
52
52
  -----------------------------------
53
53
 
54
54
  You can navigate to the directory that contains the plugin, run the `bundle install` command
@@ -74,7 +74,7 @@ In this example you will add a method to String named `to_squawk`. To begin, cre
74
74
 
75
75
  require 'test_helper'
76
76
 
77
- class CoreExtTest < Test::Unit::TestCase
77
+ class CoreExtTest < ActiveSupport::TestCase
78
78
  def test_to_squawk_prepends_the_word_squawk
79
79
  assert_equal "squawk! Hello World", "Hello World".to_squawk
80
80
  end
@@ -92,7 +92,7 @@ Run `rake` to run the test. This test should fail because we haven't implemented
92
92
 
93
93
  Great - now you are ready to start development.
94
94
 
95
- Then in `lib/yaffle.rb` add `require "yaffle/core_ext"`:
95
+ In `lib/yaffle.rb`, add `require "yaffle/core_ext"`:
96
96
 
97
97
  ```ruby
98
98
  # yaffle/lib/yaffle.rb
@@ -124,7 +124,7 @@ To test that your method does what it says it does, run the unit tests with `rak
124
124
  To see this in action, change to the test/dummy directory, fire up a console and start squawking:
125
125
 
126
126
  ```bash
127
- $ rails console
127
+ $ bin/rails console
128
128
  >> "Hello World".to_squawk
129
129
  => "squawk! Hello World"
130
130
  ```
@@ -132,8 +132,8 @@ $ rails console
132
132
  Add an "acts_as" Method to Active Record
133
133
  ----------------------------------------
134
134
 
135
- A common pattern in plugins is to add a method called 'acts_as_something' to models. In this case, you
136
- want to write a method called 'acts_as_yaffle' that adds a 'squawk' method to your Active Record models.
135
+ A common pattern in plugins is to add a method called `acts_as_something` to models. In this case, you
136
+ want to write a method called `acts_as_yaffle` that adds a `squawk` method to your Active Record models.
137
137
 
138
138
  To begin, set up your files so that you have:
139
139
 
@@ -142,7 +142,7 @@ To begin, set up your files so that you have:
142
142
 
143
143
  require 'test_helper'
144
144
 
145
- class ActsAsYaffleTest < Test::Unit::TestCase
145
+ class ActsAsYaffleTest < ActiveSupport::TestCase
146
146
  end
147
147
  ```
148
148
 
@@ -168,9 +168,9 @@ end
168
168
 
169
169
  ### Add a Class Method
170
170
 
171
- This plugin will expect that you've added a method to your model named 'last_squawk'. However, the
172
- plugin users might have already defined a method on their model named 'last_squawk' that they use
173
- for something else. This plugin will allow the name to be changed by adding a class method called 'yaffle_text_field'.
171
+ This plugin will expect that you've added a method to your model named `last_squawk`. However, the
172
+ plugin users might have already defined a method on their model named `last_squawk` that they use
173
+ for something else. This plugin will allow the name to be changed by adding a class method called `yaffle_text_field`.
174
174
 
175
175
  To start out, write a failing test that shows the behavior you'd like:
176
176
 
@@ -179,7 +179,7 @@ To start out, write a failing test that shows the behavior you'd like:
179
179
 
180
180
  require 'test_helper'
181
181
 
182
- class ActsAsYaffleTest < Test::Unit::TestCase
182
+ class ActsAsYaffleTest < ActiveSupport::TestCase
183
183
 
184
184
  def test_a_hickwalls_yaffle_text_field_should_be_last_squawk
185
185
  assert_equal "last_squawk", Hickwall.yaffle_text_field
@@ -214,17 +214,16 @@ test/dummy directory:
214
214
 
215
215
  ```bash
216
216
  $ cd test/dummy
217
- $ rails generate model Hickwall last_squawk:string
218
- $ rails generate model Wickwall last_squawk:string last_tweet:string
217
+ $ bin/rails generate model Hickwall last_squawk:string
218
+ $ bin/rails generate model Wickwall last_squawk:string last_tweet:string
219
219
  ```
220
220
 
221
221
  Now you can create the necessary database tables in your testing database by navigating to your dummy app
222
- and migrating the database. First
222
+ and migrating the database. First, run:
223
223
 
224
224
  ```bash
225
225
  $ cd test/dummy
226
- $ rake db:migrate
227
- $ rake db:test:prepare
226
+ $ bin/rake db:migrate
228
227
  ```
229
228
 
230
229
  While you are here, change the Hickwall and Wickwall models so that they know that they are supposed to act
@@ -245,7 +244,7 @@ end
245
244
 
246
245
  ```
247
246
 
248
- We will also add code to define the acts_as_yaffle method.
247
+ We will also add code to define the `acts_as_yaffle` method.
249
248
 
250
249
  ```ruby
251
250
  # yaffle/lib/yaffle/acts_as_yaffle.rb
@@ -286,7 +285,7 @@ You can then return to the root directory (`cd ../..`) of your plugin and rerun
286
285
 
287
286
  ```
288
287
 
289
- Getting closer... Now we will implement the code of the acts_as_yaffle method to make the tests pass.
288
+ Getting closer... Now we will implement the code of the `acts_as_yaffle` method to make the tests pass.
290
289
 
291
290
  ```ruby
292
291
  # yaffle/lib/yaffle/acts_as_yaffle.rb
@@ -310,7 +309,7 @@ end
310
309
  ActiveRecord::Base.send :include, Yaffle::ActsAsYaffle
311
310
  ```
312
311
 
313
- When you run `rake` you should see the tests all pass:
312
+ When you run `rake`, you should see the tests all pass:
314
313
 
315
314
  ```bash
316
315
  5 tests, 5 assertions, 0 failures, 0 errors, 0 skips
@@ -327,7 +326,7 @@ To start out, write a failing test that shows the behavior you'd like:
327
326
  # yaffle/test/acts_as_yaffle_test.rb
328
327
  require 'test_helper'
329
328
 
330
- class ActsAsYaffleTest < Test::Unit::TestCase
329
+ class ActsAsYaffleTest < ActiveSupport::TestCase
331
330
 
332
331
  def test_a_hickwalls_yaffle_text_field_should_be_last_squawk
333
332
  assert_equal "last_squawk", Hickwall.yaffle_text_field
@@ -390,7 +389,11 @@ Run `rake` one final time and you should see:
390
389
  7 tests, 7 assertions, 0 failures, 0 errors, 0 skips
391
390
  ```
392
391
 
393
- NOTE: The use of `write_attribute` to write to the field in model is just one example of how a plugin can interact with the model, and will not always be the right method to use. For example, you could also use `send("#{self.class.yaffle_text_field}=", string.to_squawk)`.
392
+ NOTE: The use of `write_attribute` to write to the field in model is just one example of how a plugin can interact with the model, and will not always be the right method to use. For example, you could also use:
393
+
394
+ ```ruby
395
+ send("#{self.class.yaffle_text_field}=", string.to_squawk)
396
+ ```
394
397
 
395
398
  Generators
396
399
  ----------
@@ -398,7 +401,7 @@ Generators
398
401
  Generators can be included in your gem simply by creating them in a lib/generators directory of your plugin. More information about
399
402
  the creation of generators can be found in the [Generators Guide](generators.html)
400
403
 
401
- Publishing your Gem
404
+ Publishing Your Gem
402
405
  -------------------
403
406
 
404
407
  Gem plugins currently in development can easily be shared from any Git repository. To share the Yaffle gem with others, simply
@@ -411,12 +414,12 @@ gem 'yaffle', git: 'git://github.com/yaffle_watcher/yaffle.git'
411
414
  After running `bundle install`, your gem functionality will be available to the application.
412
415
 
413
416
  When the gem is ready to be shared as a formal release, it can be published to [RubyGems](http://www.rubygems.org).
414
- For more information about publishing gems to RubyGems, see: [Creating and Publishing Your First Ruby Gem](http://blog.thepete.net/2010/11/creating-and-publishing-your-first-ruby.html)
417
+ For more information about publishing gems to RubyGems, see: [Creating and Publishing Your First Ruby Gem](http://blog.thepete.net/2010/11/creating-and-publishing-your-first-ruby.html).
415
418
 
416
419
  RDoc Documentation
417
420
  ------------------
418
421
 
419
- Once your plugin is stable and you are ready to deploy do everyone else a favor and document it! Luckily, writing documentation for your plugin is easy.
422
+ Once your plugin is stable and you are ready to deploy, do everyone else a favor and document it! Luckily, writing documentation for your plugin is easy.
420
423
 
421
424
  The first step is to update the README file with detailed information about how to use your plugin. A few key things to include are:
422
425
 
@@ -430,7 +433,7 @@ Once your README is solid, go through and add rdoc comments to all of the method
430
433
  Once your comments are good to go, navigate to your plugin directory and run:
431
434
 
432
435
  ```bash
433
- $ rake rdoc
436
+ $ bin/rake rdoc
434
437
  ```
435
438
 
436
439
  ### References
@@ -23,8 +23,8 @@ $ rails new blog -m http://example.com/template.rb
23
23
  You can use the rake task `rails:template` to apply templates to an existing Rails application. The location of the template needs to be passed in to an environment variable named LOCATION. Again, this can either be path to a file or a URL.
24
24
 
25
25
  ```bash
26
- $ rake rails:template LOCATION=~/template.rb
27
- $ rake rails:template LOCATION=http://example.com/template.rb
26
+ $ bin/rake rails:template LOCATION=~/template.rb
27
+ $ bin/rake rails:template LOCATION=http://example.com/template.rb
28
28
  ```
29
29
 
30
30
  Template API
@@ -47,7 +47,7 @@ The following sections outline the primary methods provided by the API:
47
47
 
48
48
  ### gem(*args)
49
49
 
50
- Adds a `gem` entry for the supplied gem to the generated applications `Gemfile`.
50
+ Adds a `gem` entry for the supplied gem to the generated application's `Gemfile`.
51
51
 
52
52
  For example, if your application depends on the gems `bj` and `nokogiri`:
53
53
 
@@ -91,14 +91,14 @@ Adds a line inside the `Application` class for `config/application.rb`.
91
91
  If `options[:env]` is specified, the line is appended to the corresponding file in `config/environments`.
92
92
 
93
93
  ```ruby
94
- environment 'config.action_mailer.default_url_options = {host: 'http://yourwebsite.example.com'}, env: 'production'
94
+ environment 'config.action_mailer.default_url_options = {host: "http://yourwebsite.example.com"}', env: 'production'
95
95
  ```
96
96
 
97
97
  A block can be used in place of the `data` argument.
98
98
 
99
99
  ### vendor/lib/file/initializer(filename, data = nil, &block)
100
100
 
101
- Adds an initializer to the generated applications `config/initializers` directory.
101
+ Adds an initializer to the generated application's `config/initializers` directory.
102
102
 
103
103
  Let's say you like using `Object#not_nil?` and `Object#not_blank?`:
104
104
 
@@ -127,7 +127,7 @@ file 'app/components/foo.rb', <<-CODE
127
127
  CODE
128
128
  ```
129
129
 
130
- Thatll create the `app/components` directory and put `foo.rb` in there.
130
+ That'll create the `app/components` directory and put `foo.rb` in there.
131
131
 
132
132
  ### rakefile(filename, data = nil, &block)
133
133
 
@@ -197,7 +197,7 @@ end
197
197
 
198
198
  ### ask(question)
199
199
 
200
- `ask()` gives you a chance to get some feedback from the user and use it in your templates. Let's say you want your user to name the new shiny library youre adding:
200
+ `ask()` gives you a chance to get some feedback from the user and use it in your templates. Let's say you want your user to name the new shiny library you're adding:
201
201
 
202
202
  ```ruby
203
203
  lib_name = ask("What do you want to call the shiny library ?")
@@ -211,7 +211,7 @@ CODE
211
211
 
212
212
  ### yes?(question) or no?(question)
213
213
 
214
- These methods let you ask questions from templates and decide the flow based on the users answer. Let's say you want to freeze rails only if the user wants to:
214
+ These methods let you ask questions from templates and decide the flow based on the user's answer. Let's say you want to freeze rails only if the user wants to:
215
215
 
216
216
  ```ruby
217
217
  rake("rails:freeze:gems") if yes?("Freeze rails gems?")
@@ -227,3 +227,22 @@ git :init
227
227
  git add: "."
228
228
  git commit: "-a -m 'Initial commit'"
229
229
  ```
230
+
231
+ Advanced Usage
232
+ --------------
233
+
234
+ The application template is evaluated in the context of a
235
+ `Rails::Generators::AppGenerator` instance. It uses the `apply` action
236
+ provided by
237
+ [Thor](https://github.com/erikhuda/thor/blob/master/lib/thor/actions.rb#L207).
238
+ This means you can extend and change the instance to match your needs.
239
+
240
+ For example by overwriting the `source_paths` method to contain the
241
+ location of your template. Now methods like `copy_file` will accept
242
+ relative paths to your template's location.
243
+
244
+ ```ruby
245
+ def source_paths
246
+ [File.expand_path(File.dirname(__FILE__))]
247
+ end
248
+ ```
@@ -5,7 +5,6 @@ This guide covers Rails integration with Rack and interfacing with other Rack co
5
5
 
6
6
  After reading this guide, you will know:
7
7
 
8
- * How to create Rails Metal applications.
9
8
  * How to use Rack Middlewares in your Rails applications.
10
9
  * Action Pack's internal Middleware stack.
11
10
  * How to define a custom Middleware stack.
@@ -28,10 +27,9 @@ Rails on Rack
28
27
 
29
28
  ### Rails Application's Rack Object
30
29
 
31
- `ApplicationName::Application` is the primary Rack application object of a Rails
30
+ `Rails.application` is the primary Rack application object of a Rails
32
31
  application. Any Rack compliant web server should be using
33
- `ApplicationName::Application` object to serve a Rails
34
- application. `Rails.application` refers to the same application object.
32
+ `Rails.application` object to serve a Rails application.
35
33
 
36
34
  ### `rails server`
37
35
 
@@ -82,9 +80,9 @@ To use `rackup` instead of Rails' `rails server`, you can put the following insi
82
80
 
83
81
  ```ruby
84
82
  # Rails.root/config.ru
85
- require ::File.expand_path('../config/environment', __FILE__)
83
+ require ::File.expand_path('../config/environment', __FILE__)
86
84
 
87
- use Rack::Debugger
85
+ use Rails::Rack::Debugger
88
86
  use Rack::ContentLength
89
87
  run Rails.application
90
88
  ```
@@ -113,12 +111,13 @@ NOTE: `ActionDispatch::MiddlewareStack` is Rails equivalent of `Rack::Builder`,
113
111
  Rails has a handy rake task for inspecting the middleware stack in use:
114
112
 
115
113
  ```bash
116
- $ rake middleware
114
+ $ bin/rake middleware
117
115
  ```
118
116
 
119
117
  For a freshly generated Rails application, this might produce something like:
120
118
 
121
119
  ```ruby
120
+ use Rack::Sendfile
122
121
  use ActionDispatch::Static
123
122
  use Rack::Lock
124
123
  use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x000000029a0838>
@@ -131,6 +130,7 @@ use ActionDispatch::DebugExceptions
131
130
  use ActionDispatch::RemoteIp
132
131
  use ActionDispatch::Reloader
133
132
  use ActionDispatch::Callbacks
133
+ use ActiveRecord::Migration::CheckPending
134
134
  use ActiveRecord::ConnectionAdapters::ConnectionManagement
135
135
  use ActiveRecord::QueryCache
136
136
  use ActionDispatch::Cookies
@@ -140,10 +140,10 @@ use ActionDispatch::ParamsParser
140
140
  use Rack::Head
141
141
  use Rack::ConditionalGet
142
142
  use Rack::ETag
143
- run MyApp::Application.routes
143
+ run Rails.application.routes
144
144
  ```
145
145
 
146
- Purpose of each of this middlewares is explained in the [Internal Middlewares](#internal-middleware-stack) section.
146
+ The default middlewares shown here (and some others) are each summarized in the [Internal Middlewares](#internal-middleware-stack) section, below.
147
147
 
148
148
  ### Configuring Middleware Stack
149
149
 
@@ -181,27 +181,26 @@ You can swap an existing middleware in the middleware stack using `config.middle
181
181
  config.middleware.swap ActionDispatch::ShowExceptions, Lifo::ShowExceptions
182
182
  ```
183
183
 
184
- #### Middleware Stack is an Enumerable
184
+ #### Deleting a Middleware
185
185
 
186
- The middleware stack behaves just like a normal `Enumerable`. You can use any `Enumerable` methods to manipulate or interrogate the stack. The middleware stack also implements some `Array` methods including `[]`, `unshift` and `delete`. Methods described in the section above are just convenience methods.
187
-
188
- Append following lines to your application configuration:
186
+ Add the following lines to your application configuration:
189
187
 
190
188
  ```ruby
191
189
  # config/application.rb
192
190
  config.middleware.delete "Rack::Lock"
193
191
  ```
194
192
 
195
- And now if you inspect the middleware stack, you'll find that `Rack::Lock` will not be part of it.
193
+ And now if you inspect the middleware stack, you'll find that `Rack::Lock` is
194
+ not a part of it.
196
195
 
197
196
  ```bash
198
- $ rake middleware
197
+ $ bin/rake middleware
199
198
  (in /Users/lifo/Rails/blog)
200
199
  use ActionDispatch::Static
201
200
  use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000001c304c8>
202
201
  use Rack::Runtime
203
202
  ...
204
- run Blog::Application.routes
203
+ run Rails.application.routes
205
204
  ```
206
205
 
207
206
  If you want to remove session related middleware, do the following:
@@ -224,116 +223,100 @@ config.middleware.delete "Rack::MethodOverride"
224
223
 
225
224
  Much of Action Controller's functionality is implemented as Middlewares. The following list explains the purpose of each of them:
226
225
 
227
- **`Rack::Sendfile`**
226
+ **`Rack::Sendfile`**
228
227
 
229
228
  * Sets server specific X-Sendfile header. Configure this via `config.action_dispatch.x_sendfile_header` option.
230
229
 
231
- **`ActionDispatch::Static`**
230
+ **`ActionDispatch::Static`**
232
231
 
233
232
  * Used to serve static assets. Disabled if `config.serve_static_assets` is `false`.
234
233
 
235
- **`Rack::Lock`**
234
+ **`Rack::Lock`**
236
235
 
237
236
  * Sets `env["rack.multithread"]` flag to `false` and wraps the application within a Mutex.
238
237
 
239
- **`ActiveSupport::Cache::Strategy::LocalCache::Middleware`**
238
+ **`ActiveSupport::Cache::Strategy::LocalCache::Middleware`**
240
239
 
241
240
  * Used for memory caching. This cache is not thread safe.
242
241
 
243
- **`Rack::Runtime`**
242
+ **`Rack::Runtime`**
244
243
 
245
244
  * Sets an X-Runtime header, containing the time (in seconds) taken to execute the request.
246
245
 
247
- **`Rack::MethodOverride`**
246
+ **`Rack::MethodOverride`**
248
247
 
249
248
  * Allows the method to be overridden if `params[:_method]` is set. This is the middleware which supports the PUT and DELETE HTTP method types.
250
249
 
251
- **`ActionDispatch::RequestId`**
250
+ **`ActionDispatch::RequestId`**
252
251
 
253
252
  * Makes a unique `X-Request-Id` header available to the response and enables the `ActionDispatch::Request#uuid` method.
254
253
 
255
- **`Rails::Rack::Logger`**
254
+ **`Rails::Rack::Logger`**
256
255
 
257
256
  * Notifies the logs that the request has began. After request is complete, flushes all the logs.
258
257
 
259
- **`ActionDispatch::ShowExceptions`**
258
+ **`ActionDispatch::ShowExceptions`**
260
259
 
261
260
  * Rescues any exception returned by the application and calls an exceptions app that will wrap it in a format for the end user.
262
261
 
263
- **`ActionDispatch::DebugExceptions`**
262
+ **`ActionDispatch::DebugExceptions`**
264
263
 
265
264
  * Responsible for logging exceptions and showing a debugging page in case the request is local.
266
265
 
267
- **`ActionDispatch::RemoteIp`**
266
+ **`ActionDispatch::RemoteIp`**
268
267
 
269
268
  * Checks for IP spoofing attacks.
270
269
 
271
- **`ActionDispatch::Reloader`**
270
+ **`ActionDispatch::Reloader`**
272
271
 
273
272
  * Provides prepare and cleanup callbacks, intended to assist with code reloading during development.
274
273
 
275
- **`ActionDispatch::Callbacks`**
274
+ **`ActionDispatch::Callbacks`**
276
275
 
277
276
  * Runs the prepare callbacks before serving the request.
278
277
 
279
- **`ActiveRecord::ConnectionAdapters::ConnectionManagement`**
278
+ **`ActiveRecord::Migration::CheckPending`**
279
+
280
+ * Checks pending migrations and raises `ActiveRecord::PendingMigrationError` if any migrations are pending.
281
+
282
+ **`ActiveRecord::ConnectionAdapters::ConnectionManagement`**
280
283
 
281
284
  * Cleans active connections after each request, unless the `rack.test` key in the request environment is set to `true`.
282
285
 
283
- **`ActiveRecord::QueryCache`**
286
+ **`ActiveRecord::QueryCache`**
284
287
 
285
288
  * Enables the Active Record query cache.
286
289
 
287
- **`ActionDispatch::Cookies`**
290
+ **`ActionDispatch::Cookies`**
288
291
 
289
292
  * Sets cookies for the request.
290
293
 
291
- **`ActionDispatch::Session::CookieStore`**
294
+ **`ActionDispatch::Session::CookieStore`**
292
295
 
293
296
  * Responsible for storing the session in cookies.
294
297
 
295
- **`ActionDispatch::Flash`**
298
+ **`ActionDispatch::Flash`**
296
299
 
297
300
  * Sets up the flash keys. Only available if `config.action_controller.session_store` is set to a value.
298
301
 
299
- **`ActionDispatch::ParamsParser`**
302
+ **`ActionDispatch::ParamsParser`**
300
303
 
301
304
  * Parses out parameters from the request into `params`.
302
305
 
303
- **`ActionDispatch::Head`**
306
+ **`ActionDispatch::Head`**
304
307
 
305
308
  * Converts HEAD requests to `GET` requests and serves them as so.
306
309
 
307
- **`Rack::ConditionalGet`**
310
+ **`Rack::ConditionalGet`**
308
311
 
309
312
  * Adds support for "Conditional `GET`" so that server responds with nothing if page wasn't changed.
310
313
 
311
- **`Rack::ETag`**
314
+ **`Rack::ETag`**
312
315
 
313
316
  * Adds ETag header on all String bodies. ETags are used to validate cache.
314
317
 
315
318
  TIP: It's possible to use any of the above middlewares in your custom Rack stack.
316
319
 
317
- ### Using Rack Builder
318
-
319
- The following shows how to replace use `Rack::Builder` instead of the Rails supplied `MiddlewareStack`.
320
-
321
- <strong>Clear the existing Rails middleware stack</strong>
322
-
323
- ```ruby
324
- # config/application.rb
325
- config.middleware.clear
326
- ```
327
-
328
- <br />
329
- <strong>Add a `config.ru` file to `Rails.root`</strong>
330
-
331
- ```ruby
332
- # config.ru
333
- use MyOwnStackFromScratch
334
- run Rails.application
335
- ```
336
-
337
320
  Resources
338
321
  ---------
339
322