rails 4.2.0.beta4 → 4.2.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/guides/Rakefile +3 -1
- data/guides/bug_report_templates/action_controller_gem.rb +2 -2
- data/guides/bug_report_templates/action_controller_master.rb +2 -2
- data/guides/source/3_0_release_notes.md +2 -2
- data/guides/source/4_1_release_notes.md +1 -1
- data/guides/source/4_2_release_notes.md +250 -225
- data/guides/source/_welcome.html.erb +1 -1
- data/guides/source/action_controller_overview.md +6 -6
- data/guides/source/action_mailer_basics.md +26 -11
- data/guides/source/action_view_overview.md +0 -1
- data/guides/source/active_job_basics.md +29 -23
- data/guides/source/active_record_postgresql.md +2 -7
- data/guides/source/active_record_validations.md +1 -0
- data/guides/source/active_support_core_extensions.md +1 -1
- data/guides/source/active_support_instrumentation.md +5 -5
- data/guides/source/asset_pipeline.md +2 -2
- data/guides/source/association_basics.md +0 -2
- data/guides/source/command_line.md +6 -15
- data/guides/source/configuring.md +4 -4
- data/guides/source/documents.yaml +0 -1
- data/guides/source/engines.md +26 -15
- data/guides/source/form_helpers.md +10 -2
- data/guides/source/getting_started.md +9 -9
- data/guides/source/rails_on_rack.md +2 -2
- data/guides/source/ruby_on_rails_guides_guidelines.md +1 -0
- data/guides/source/security.md +1 -1
- data/guides/source/testing.md +80 -13
- data/guides/source/upgrading_ruby_on_rails.md +23 -20
- metadata +29 -229
- data/guides/output/2_2_release_notes.html +0 -724
- data/guides/output/2_3_release_notes.html +0 -870
- data/guides/output/3_0_release_notes.html +0 -773
- data/guides/output/3_1_release_notes.html +0 -740
- data/guides/output/3_2_release_notes.html +0 -797
- data/guides/output/4_0_release_notes.html +0 -523
- data/guides/output/4_1_release_notes.html +0 -806
- data/guides/output/4_2_release_notes.html +0 -728
- data/guides/output/Gemfile +0 -6
- data/guides/output/_license.html +0 -226
- data/guides/output/_welcome.html +0 -233
- data/guides/output/action_controller_overview.html +0 -1335
- data/guides/output/action_mailer_basics.html +0 -928
- data/guides/output/action_view_overview.html +0 -1509
- data/guides/output/active_job_basics.html +0 -546
- data/guides/output/active_model_basics.html +0 -438
- data/guides/output/active_record_basics.html +0 -594
- data/guides/output/active_record_callbacks.html +0 -592
- data/guides/output/active_record_migrations.html +0 -1123
- data/guides/output/active_record_postgresql.html +0 -675
- data/guides/output/active_record_querying.html +0 -1796
- data/guides/output/active_record_validations.html +0 -1301
- data/guides/output/active_support_core_extensions.html +0 -3450
- data/guides/output/active_support_instrumentation.html +0 -1121
- data/guides/output/api_documentation_guidelines.html +0 -498
- data/guides/output/asset_pipeline.html +0 -1167
- data/guides/output/association_basics.html +0 -2086
- data/guides/output/caching_with_rails.html +0 -553
- data/guides/output/command_line.html +0 -791
- data/guides/output/configuring.html +0 -1055
- data/guides/output/contributing_to_ruby_on_rails.html +0 -657
- data/guides/output/credits.html +0 -284
- data/guides/output/debugging_rails_applications.html +0 -1014
- data/guides/output/development_dependencies_install.html +0 -478
- data/guides/output/engines.html +0 -1438
- data/guides/output/form_helpers.html +0 -1074
- data/guides/output/generators.html +0 -838
- data/guides/output/getting_started.html +0 -2092
- data/guides/output/i18n.html +0 -1198
- data/guides/output/images/akshaysurve.jpg +0 -0
- data/guides/output/images/belongs_to.png +0 -0
- data/guides/output/images/book_icon.gif +0 -0
- data/guides/output/images/bullet.gif +0 -0
- data/guides/output/images/chapters_icon.gif +0 -0
- data/guides/output/images/check_bullet.gif +0 -0
- data/guides/output/images/credits_pic_blank.gif +0 -0
- data/guides/output/images/csrf.png +0 -0
- data/guides/output/images/edge_badge.png +0 -0
- data/guides/output/images/favicon.ico +0 -0
- data/guides/output/images/feature_tile.gif +0 -0
- data/guides/output/images/footer_tile.gif +0 -0
- data/guides/output/images/fxn.png +0 -0
- data/guides/output/images/getting_started/article_with_comments.png +0 -0
- data/guides/output/images/getting_started/challenge.png +0 -0
- data/guides/output/images/getting_started/confirm_dialog.png +0 -0
- data/guides/output/images/getting_started/forbidden_attributes_for_new_article.png +0 -0
- data/guides/output/images/getting_started/forbidden_attributes_for_new_post.png +0 -0
- data/guides/output/images/getting_started/form_with_errors.png +0 -0
- data/guides/output/images/getting_started/index_action_with_edit_link.png +0 -0
- data/guides/output/images/getting_started/new_article.png +0 -0
- data/guides/output/images/getting_started/new_post.png +0 -0
- data/guides/output/images/getting_started/post_with_comments.png +0 -0
- data/guides/output/images/getting_started/rails_welcome.png +0 -0
- data/guides/output/images/getting_started/routing_error_no_controller.png +0 -0
- data/guides/output/images/getting_started/routing_error_no_route_matches.png +0 -0
- data/guides/output/images/getting_started/show_action_for_articles.png +0 -0
- data/guides/output/images/getting_started/show_action_for_posts.png +0 -0
- data/guides/output/images/getting_started/template_is_missing_articles_new.png +0 -0
- data/guides/output/images/getting_started/template_is_missing_posts_new.png +0 -0
- data/guides/output/images/getting_started/undefined_method_post_path.png +0 -0
- data/guides/output/images/getting_started/unknown_action_create_for_articles.png +0 -0
- data/guides/output/images/getting_started/unknown_action_create_for_posts.png +0 -0
- data/guides/output/images/getting_started/unknown_action_new_for_articles.png +0 -0
- data/guides/output/images/getting_started/unknown_action_new_for_posts.png +0 -0
- data/guides/output/images/grey_bullet.gif +0 -0
- data/guides/output/images/habtm.png +0 -0
- data/guides/output/images/has_many.png +0 -0
- data/guides/output/images/has_many_through.png +0 -0
- data/guides/output/images/has_one.png +0 -0
- data/guides/output/images/has_one_through.png +0 -0
- data/guides/output/images/header_backdrop.png +0 -0
- data/guides/output/images/header_tile.gif +0 -0
- data/guides/output/images/i18n/demo_html_safe.png +0 -0
- data/guides/output/images/i18n/demo_localized_pirate.png +0 -0
- data/guides/output/images/i18n/demo_translated_en.png +0 -0
- data/guides/output/images/i18n/demo_translated_pirate.png +0 -0
- data/guides/output/images/i18n/demo_translation_missing.png +0 -0
- data/guides/output/images/i18n/demo_untranslated.png +0 -0
- data/guides/output/images/icons/README +0 -5
- data/guides/output/images/icons/callouts/1.png +0 -0
- data/guides/output/images/icons/callouts/10.png +0 -0
- data/guides/output/images/icons/callouts/11.png +0 -0
- data/guides/output/images/icons/callouts/12.png +0 -0
- data/guides/output/images/icons/callouts/13.png +0 -0
- data/guides/output/images/icons/callouts/14.png +0 -0
- data/guides/output/images/icons/callouts/15.png +0 -0
- data/guides/output/images/icons/callouts/2.png +0 -0
- data/guides/output/images/icons/callouts/3.png +0 -0
- data/guides/output/images/icons/callouts/4.png +0 -0
- data/guides/output/images/icons/callouts/5.png +0 -0
- data/guides/output/images/icons/callouts/6.png +0 -0
- data/guides/output/images/icons/callouts/7.png +0 -0
- data/guides/output/images/icons/callouts/8.png +0 -0
- data/guides/output/images/icons/callouts/9.png +0 -0
- data/guides/output/images/icons/caution.png +0 -0
- data/guides/output/images/icons/example.png +0 -0
- data/guides/output/images/icons/home.png +0 -0
- data/guides/output/images/icons/important.png +0 -0
- data/guides/output/images/icons/next.png +0 -0
- data/guides/output/images/icons/note.png +0 -0
- data/guides/output/images/icons/prev.png +0 -0
- data/guides/output/images/icons/tip.png +0 -0
- data/guides/output/images/icons/up.png +0 -0
- data/guides/output/images/icons/warning.png +0 -0
- data/guides/output/images/nav_arrow.gif +0 -0
- data/guides/output/images/oscardelben.jpg +0 -0
- data/guides/output/images/polymorphic.png +0 -0
- data/guides/output/images/radar.png +0 -0
- data/guides/output/images/rails4_features.png +0 -0
- data/guides/output/images/rails_guides_kindle_cover.jpg +0 -0
- data/guides/output/images/rails_guides_logo.gif +0 -0
- data/guides/output/images/rails_logo_remix.gif +0 -0
- data/guides/output/images/session_fixation.png +0 -0
- data/guides/output/images/tab_grey.gif +0 -0
- data/guides/output/images/tab_info.gif +0 -0
- data/guides/output/images/tab_note.gif +0 -0
- data/guides/output/images/tab_red.gif +0 -0
- data/guides/output/images/tab_yellow.gif +0 -0
- data/guides/output/images/tab_yellow.png +0 -0
- data/guides/output/images/vijaydev.jpg +0 -0
- data/guides/output/index.html +0 -354
- data/guides/output/initialization.html +0 -876
- data/guides/output/javascripts/guides.js +0 -59
- data/guides/output/javascripts/jquery.min.js +0 -4
- data/guides/output/javascripts/responsive-tables.js +0 -43
- data/guides/output/javascripts/syntaxhighlighter/shBrushAS3.js +0 -59
- data/guides/output/javascripts/syntaxhighlighter/shBrushAppleScript.js +0 -75
- data/guides/output/javascripts/syntaxhighlighter/shBrushBash.js +0 -59
- data/guides/output/javascripts/syntaxhighlighter/shBrushCSharp.js +0 -65
- data/guides/output/javascripts/syntaxhighlighter/shBrushColdFusion.js +0 -100
- data/guides/output/javascripts/syntaxhighlighter/shBrushCpp.js +0 -97
- data/guides/output/javascripts/syntaxhighlighter/shBrushCss.js +0 -91
- data/guides/output/javascripts/syntaxhighlighter/shBrushDelphi.js +0 -55
- data/guides/output/javascripts/syntaxhighlighter/shBrushDiff.js +0 -41
- data/guides/output/javascripts/syntaxhighlighter/shBrushErlang.js +0 -52
- data/guides/output/javascripts/syntaxhighlighter/shBrushGroovy.js +0 -67
- data/guides/output/javascripts/syntaxhighlighter/shBrushJScript.js +0 -52
- data/guides/output/javascripts/syntaxhighlighter/shBrushJava.js +0 -57
- data/guides/output/javascripts/syntaxhighlighter/shBrushJavaFX.js +0 -58
- data/guides/output/javascripts/syntaxhighlighter/shBrushPerl.js +0 -72
- data/guides/output/javascripts/syntaxhighlighter/shBrushPhp.js +0 -88
- data/guides/output/javascripts/syntaxhighlighter/shBrushPlain.js +0 -33
- data/guides/output/javascripts/syntaxhighlighter/shBrushPowerShell.js +0 -74
- data/guides/output/javascripts/syntaxhighlighter/shBrushPython.js +0 -64
- data/guides/output/javascripts/syntaxhighlighter/shBrushRuby.js +0 -55
- data/guides/output/javascripts/syntaxhighlighter/shBrushSass.js +0 -94
- data/guides/output/javascripts/syntaxhighlighter/shBrushScala.js +0 -51
- data/guides/output/javascripts/syntaxhighlighter/shBrushSql.js +0 -66
- data/guides/output/javascripts/syntaxhighlighter/shBrushVb.js +0 -56
- data/guides/output/javascripts/syntaxhighlighter/shBrushXml.js +0 -69
- data/guides/output/javascripts/syntaxhighlighter/shCore.js +0 -17
- data/guides/output/layout.html +0 -448
- data/guides/output/layouts_and_rendering.html +0 -1541
- data/guides/output/maintenance_policy.html +0 -257
- data/guides/output/migrations.html +0 -1360
- data/guides/output/nested_model_forms.html +0 -412
- data/guides/output/plugins.html +0 -644
- data/guides/output/rails_application_templates.html +0 -450
- data/guides/output/rails_on_rack.html +0 -547
- data/guides/output/routing.html +0 -1631
- data/guides/output/ruby_on_rails_guides_guidelines.html +0 -329
- data/guides/output/security.html +0 -935
- data/guides/output/stylesheets/fixes.css +0 -16
- data/guides/output/stylesheets/kindle.css +0 -11
- data/guides/output/stylesheets/main.css +0 -713
- data/guides/output/stylesheets/print.css +0 -52
- data/guides/output/stylesheets/reset.css +0 -43
- data/guides/output/stylesheets/responsive-tables.css +0 -50
- data/guides/output/stylesheets/style.css +0 -13
- data/guides/output/stylesheets/syntaxhighlighter/shCore.css +0 -226
- data/guides/output/stylesheets/syntaxhighlighter/shCoreDefault.css +0 -328
- data/guides/output/stylesheets/syntaxhighlighter/shCoreDjango.css +0 -331
- data/guides/output/stylesheets/syntaxhighlighter/shCoreEclipse.css +0 -339
- data/guides/output/stylesheets/syntaxhighlighter/shCoreEmacs.css +0 -324
- data/guides/output/stylesheets/syntaxhighlighter/shCoreFadeToGrey.css +0 -328
- data/guides/output/stylesheets/syntaxhighlighter/shCoreMDUltra.css +0 -324
- data/guides/output/stylesheets/syntaxhighlighter/shCoreMidnight.css +0 -324
- data/guides/output/stylesheets/syntaxhighlighter/shCoreRDark.css +0 -324
- data/guides/output/stylesheets/syntaxhighlighter/shThemeDefault.css +0 -117
- data/guides/output/stylesheets/syntaxhighlighter/shThemeDjango.css +0 -120
- data/guides/output/stylesheets/syntaxhighlighter/shThemeEclipse.css +0 -128
- data/guides/output/stylesheets/syntaxhighlighter/shThemeEmacs.css +0 -113
- data/guides/output/stylesheets/syntaxhighlighter/shThemeFadeToGrey.css +0 -117
- data/guides/output/stylesheets/syntaxhighlighter/shThemeMDUltra.css +0 -113
- data/guides/output/stylesheets/syntaxhighlighter/shThemeMidnight.css +0 -113
- data/guides/output/stylesheets/syntaxhighlighter/shThemeRDark.css +0 -113
- data/guides/output/stylesheets/syntaxhighlighter/shThemeRailsGuides.css +0 -116
- data/guides/output/testing.html +0 -1350
- data/guides/output/upgrading_ruby_on_rails.html +0 -1135
- data/guides/output/working_with_javascript_in_rails.html +0 -587
@@ -153,7 +153,7 @@ pipeline is enabled. It is set to true by default.
|
|
153
153
|
|
154
154
|
* `config.assets.manifest` defines the full path to be used for the asset precompiler's manifest file. Defaults to a file named `manifest-<random>.json` in the `config.assets.prefix` directory within the public folder.
|
155
155
|
|
156
|
-
* `config.assets.digest` enables the use of MD5 fingerprints in asset names. Set to `true` by default in `production.rb`.
|
156
|
+
* `config.assets.digest` enables the use of MD5 fingerprints in asset names. Set to `true` by default in `production.rb` and `development.rb`.
|
157
157
|
|
158
158
|
* `config.assets.debug` disables the concatenation and compression of assets. Set to `true` by default in `development.rb`.
|
159
159
|
|
@@ -214,7 +214,7 @@ Every Rails application comes with a standard set of middleware which it uses in
|
|
214
214
|
* `ActionDispatch::Flash` sets up the `flash` keys. Only available if `config.action_controller.session_store` is set to a value.
|
215
215
|
* `ActionDispatch::ParamsParser` parses out parameters from the request into `params`.
|
216
216
|
* `Rack::MethodOverride` allows the method to be overridden if `params[:_method]` is set. This is the middleware which supports the PATCH, PUT, and DELETE HTTP method types.
|
217
|
-
* `
|
217
|
+
* `Rack::Head` converts HEAD requests to GET requests and serves them as so.
|
218
218
|
|
219
219
|
Besides these usual middleware, you can add your own by using the `config.middleware.use` method:
|
220
220
|
|
@@ -225,13 +225,13 @@ config.middleware.use Magical::Unicorns
|
|
225
225
|
This will put the `Magical::Unicorns` middleware on the end of the stack. You can use `insert_before` if you wish to add a middleware before another.
|
226
226
|
|
227
227
|
```ruby
|
228
|
-
config.middleware.insert_before
|
228
|
+
config.middleware.insert_before Rack::Head, Magical::Unicorns
|
229
229
|
```
|
230
230
|
|
231
231
|
There's also `insert_after` which will insert a middleware after another:
|
232
232
|
|
233
233
|
```ruby
|
234
|
-
config.middleware.insert_after
|
234
|
+
config.middleware.insert_after Rack::Head, Magical::Unicorns
|
235
235
|
```
|
236
236
|
|
237
237
|
Middlewares can also be completely swapped out and replaced with others:
|
data/guides/source/engines.md
CHANGED
@@ -32,7 +32,7 @@ directory structure, and are both generated using the `rails plugin new`
|
|
32
32
|
generator. The difference is that an engine is considered a "full plugin" by
|
33
33
|
Rails (as indicated by the `--full` option that's passed to the generator
|
34
34
|
command). We'll actually be using the `--mountable` option here, which includes
|
35
|
-
all the features of `--full`, and then some. This guide will refer to these
|
35
|
+
all the features of `--full`, and then some. This guide will refer to these
|
36
36
|
"full plugins" simply as "engines" throughout. An engine **can** be a plugin,
|
37
37
|
and a plugin **can** be an engine.
|
38
38
|
|
@@ -1036,31 +1036,42 @@ functionality, especially controllers. This means that if you were to make a
|
|
1036
1036
|
typical `GET` to a controller in a controller's functional test like this:
|
1037
1037
|
|
1038
1038
|
```ruby
|
1039
|
-
|
1039
|
+
module Blorgh
|
1040
|
+
class FooControllerTest < ActionController::TestCase
|
1041
|
+
def test_index
|
1042
|
+
get :index
|
1043
|
+
...
|
1044
|
+
end
|
1045
|
+
end
|
1046
|
+
end
|
1040
1047
|
```
|
1041
1048
|
|
1042
1049
|
It may not function correctly. This is because the application doesn't know how
|
1043
1050
|
to route these requests to the engine unless you explicitly tell it **how**. To
|
1044
|
-
do this, you must
|
1045
|
-
|
1051
|
+
do this, you must set the `@routes` instance variable to the engine's route set
|
1052
|
+
in your setup code:
|
1046
1053
|
|
1047
1054
|
```ruby
|
1048
|
-
|
1055
|
+
module Blorgh
|
1056
|
+
class FooControllerTest < ActionController::TestCase
|
1057
|
+
setup do
|
1058
|
+
@routes = Engine.routes
|
1059
|
+
end
|
1060
|
+
|
1061
|
+
def test_index
|
1062
|
+
get :index
|
1063
|
+
...
|
1064
|
+
end
|
1065
|
+
end
|
1066
|
+
end
|
1049
1067
|
```
|
1050
1068
|
|
1051
1069
|
This tells the application that you still want to perform a `GET` request to the
|
1052
1070
|
`index` action of this controller, but you want to use the engine's route to get
|
1053
1071
|
there, rather than the application's one.
|
1054
1072
|
|
1055
|
-
|
1056
|
-
|
1057
|
-
```ruby
|
1058
|
-
setup do
|
1059
|
-
@routes = Engine.routes
|
1060
|
-
end
|
1061
|
-
```
|
1062
|
-
|
1063
|
-
This will also ensure url helpers for the engine will work as expected in your tests.
|
1073
|
+
This also ensures that the engine's URL helpers will work as expected in your
|
1074
|
+
tests.
|
1064
1075
|
|
1065
1076
|
Improving engine functionality
|
1066
1077
|
------------------------------
|
@@ -1155,7 +1166,7 @@ end
|
|
1155
1166
|
|
1156
1167
|
Using `Class#class_eval` is great for simple adjustments, but for more complex
|
1157
1168
|
class modifications, you might want to consider using [`ActiveSupport::Concern`]
|
1158
|
-
(http://
|
1169
|
+
(http://api.rubyonrails.org/classes/ActiveSupport/Concern.html).
|
1159
1170
|
ActiveSupport::Concern manages load order of interlinked dependent modules and
|
1160
1171
|
classes at run time allowing you to significantly modularize your code.
|
1161
1172
|
|
@@ -96,7 +96,15 @@ form_tag({controller: "people", action: "search"}, method: "get", class: "nifty_
|
|
96
96
|
|
97
97
|
### Helpers for Generating Form Elements
|
98
98
|
|
99
|
-
Rails provides a series of helpers for generating form elements such as
|
99
|
+
Rails provides a series of helpers for generating form elements such as
|
100
|
+
checkboxes, text fields, and radio buttons. These basic helpers, with names
|
101
|
+
ending in `_tag` (such as `text_field_tag` and `check_box_tag`), generate just a
|
102
|
+
single `<input>` element. The first parameter to these is always the name of the
|
103
|
+
input. When the form is submitted, the name will be passed along with the form
|
104
|
+
data, and will make its way to the `params` hash in the controller with the
|
105
|
+
value entered by the user for that field. For example, if the form contains `<%=
|
106
|
+
text_field_tag(:query) %>`, then you would be able to get the value of this
|
107
|
+
field in the controller with `params[:query]`.
|
100
108
|
|
101
109
|
When naming inputs, Rails uses certain conventions that make it possible to submit parameters with non-scalar values such as arrays or hashes, which will also be accessible in `params`. You can read more about them in [chapter 7 of this guide](#understanding-parameter-naming-conventions). For details on the precise usage of these helpers, please refer to the [API documentation](http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html).
|
102
110
|
|
@@ -506,7 +514,7 @@ As the name implies, this only generates option tags. To generate a working sele
|
|
506
514
|
<%= collection_select(:person, :city_id, City.all, :id, :name) %>
|
507
515
|
```
|
508
516
|
|
509
|
-
As with other helpers, if you were to use the collection_select helper on a form builder scoped to the
|
517
|
+
As with other helpers, if you were to use the `collection_select` helper on a form builder scoped to the `@person` object, the syntax would be:
|
510
518
|
|
511
519
|
```erb
|
512
520
|
<%= f.collection_select(:city_id, City.all, :id, :name) %>
|
@@ -101,7 +101,7 @@ If you don't have Ruby installed have a look at
|
|
101
101
|
install Ruby on your platform.
|
102
102
|
|
103
103
|
Many popular UNIX-like OSes ship with an acceptable version of SQLite3. Windows
|
104
|
-
users and others can find installation instructions at
|
104
|
+
users and others can find installation instructions at the [SQLite3 website](https://www.sqlite.org).
|
105
105
|
Verify that it is correctly installed and in your PATH:
|
106
106
|
|
107
107
|
```bash
|
@@ -165,7 +165,7 @@ of the files and folders that Rails created by default:
|
|
165
165
|
|config/|Configure your application's routes, database, and more. This is covered in more detail in [Configuring Rails Applications](configuring.html).|
|
166
166
|
|config.ru|Rack configuration for Rack based servers used to start the application.|
|
167
167
|
|db/|Contains your current database schema, as well as the database migrations.|
|
168
|
-
|Gemfile<br>Gemfile.lock|These files allow you to specify what gem dependencies are needed for your Rails application. These files are used by the Bundler gem. For more information about Bundler, see
|
168
|
+
|Gemfile<br>Gemfile.lock|These files allow you to specify what gem dependencies are needed for your Rails application. These files are used by the Bundler gem. For more information about Bundler, see the [Bundler website](http://bundler.io).|
|
169
169
|
|lib/|Extended modules for your application.|
|
170
170
|
|log/|Application log files.|
|
171
171
|
|public/|The only folder seen by the world as-is. Contains static files and compiled assets.|
|
@@ -195,8 +195,8 @@ TIP: Compiling CoffeeScript and JavaScript asset compression requires you
|
|
195
195
|
have a JavaScript runtime available on your system, in the absence
|
196
196
|
of a runtime you will see an `execjs` error during asset compilation.
|
197
197
|
Usually Mac OS X and Windows come with a JavaScript runtime installed.
|
198
|
-
Rails adds the `therubyracer` gem to the generated `Gemfile` in a
|
199
|
-
commented line for new apps and you can uncomment if you need it.
|
198
|
+
Rails adds the `therubyracer` gem to the generated `Gemfile` in a
|
199
|
+
commented line for new apps and you can uncomment if you need it.
|
200
200
|
`therubyrhino` is the recommended runtime for JRuby users and is added by
|
201
201
|
default to the `Gemfile` in apps generated under JRuby. You can investigate
|
202
202
|
all the supported runtimes at [ExecJS](https://github.com/sstephenson/execjs#readme).
|
@@ -338,8 +338,8 @@ You can create, read, update and destroy items for a resource and these
|
|
338
338
|
operations are referred to as _CRUD_ operations.
|
339
339
|
|
340
340
|
Rails provides a `resources` method which can be used to declare a standard REST
|
341
|
-
resource.
|
342
|
-
|
341
|
+
resource. You need to add the _article resource_ to the
|
342
|
+
`config/routes.rb` as follows:
|
343
343
|
|
344
344
|
```ruby
|
345
345
|
Rails.application.routes.draw do
|
@@ -833,7 +833,7 @@ class ArticlesController < ApplicationController
|
|
833
833
|
|
834
834
|
A couple of things to note. We use `Article.find` to find the article we're
|
835
835
|
interested in, passing in `params[:id]` to get the `:id` parameter from the
|
836
|
-
request. We also use an instance variable (prefixed
|
836
|
+
request. We also use an instance variable (prefixed with `@`) to hold a
|
837
837
|
reference to the article object. We do this because Rails will pass all instance
|
838
838
|
variables to the view.
|
839
839
|
|
@@ -1279,7 +1279,7 @@ And here's how our app looks so far:
|
|
1279
1279
|
Our `edit` page looks very similar to the `new` page; in fact, they
|
1280
1280
|
both share the same code for displaying the form. Let's remove this
|
1281
1281
|
duplication by using a view partial. By convention, partial files are
|
1282
|
-
prefixed
|
1282
|
+
prefixed with an underscore.
|
1283
1283
|
|
1284
1284
|
TIP: You can read more about partials in the
|
1285
1285
|
[Layouts and Rendering in Rails](layouts_and_rendering.html) guide.
|
@@ -2049,7 +2049,7 @@ command-line utility:
|
|
2049
2049
|
in your web browser to explore the API documentation.
|
2050
2050
|
|
2051
2051
|
TIP: To be able to generate the Rails Guides locally with the `doc:guides` rake
|
2052
|
-
task you need to install the RedCloth
|
2052
|
+
task you need to install the RedCloth and Nokogiri gems. Add it to your `Gemfile` and run
|
2053
2053
|
`bundle install` and you're ready to go.
|
2054
2054
|
|
2055
2055
|
Configuration Gotchas
|
@@ -277,7 +277,7 @@ Much of Action Controller's functionality is implemented as Middlewares. The fol
|
|
277
277
|
|
278
278
|
**`ActionDispatch::Callbacks`**
|
279
279
|
|
280
|
-
*
|
280
|
+
* Provides callbacks to be executed before and after dispatching the request.
|
281
281
|
|
282
282
|
**`ActiveRecord::Migration::CheckPending`**
|
283
283
|
|
@@ -307,7 +307,7 @@ Much of Action Controller's functionality is implemented as Middlewares. The fol
|
|
307
307
|
|
308
308
|
* Parses out parameters from the request into `params`.
|
309
309
|
|
310
|
-
**`
|
310
|
+
**`Rack::Head`**
|
311
311
|
|
312
312
|
* Converts HEAD requests to `GET` requests and serves them as so.
|
313
313
|
|
@@ -54,6 +54,7 @@ API Documentation Guidelines
|
|
54
54
|
The guides and the API should be coherent and consistent where appropriate. In particular, these sections of the [API Documentation Guidelines](api_documentation_guidelines.html) also apply to the guides:
|
55
55
|
|
56
56
|
* [Wording](api_documentation_guidelines.html#wording)
|
57
|
+
* [English](api_documentation_guidelines.html#english)
|
57
58
|
* [Example Code](api_documentation_guidelines.html#example-code)
|
58
59
|
* [Filenames](api_documentation_guidelines.html#file-names)
|
59
60
|
* [Fonts](api_documentation_guidelines.html#fonts)
|
data/guides/source/security.md
CHANGED
@@ -362,7 +362,7 @@ Refer to the Injection section for countermeasures against XSS. It is _recommend
|
|
362
362
|
|
363
363
|
**CSRF** Cross-Site Request Forgery (CSRF), also known as Cross-Site Reference Forgery (XSRF), is a gigantic attack method, it allows the attacker to do everything the administrator or Intranet user may do. As you have already seen above how CSRF works, here are a few examples of what attackers can do in the Intranet or admin interface.
|
364
364
|
|
365
|
-
A real-world example is a [router reconfiguration by CSRF](http://www.h-online.com/security/Symantec-reports-first-active-attack-on-a-DSL-router
|
365
|
+
A real-world example is a [router reconfiguration by CSRF](http://www.h-online.com/security/news/item/Symantec-reports-first-active-attack-on-a-DSL-router-735883.html). The attackers sent a malicious e-mail, with CSRF in it, to Mexican users. The e-mail claimed there was an e-card waiting for them, but it also contained an image tag that resulted in a HTTP-GET request to reconfigure the user's router (which is a popular model in Mexico). The request changed the DNS-settings so that requests to a Mexico-based banking site would be mapped to the attacker's site. Everyone who accessed the banking site through that router saw the attacker's fake web site and had their credentials stolen.
|
366
366
|
|
367
367
|
Another example changed Google Adsense's e-mail address and password by. If the victim was logged into Google Adsense, the administration interface for Google advertisements campaigns, an attacker could change their credentials.
|
368
368
|
|
data/guides/source/testing.md
CHANGED
@@ -82,7 +82,7 @@ Each fixture is given a name followed by an indented list of colon-separated key
|
|
82
82
|
|
83
83
|
If you are working with [associations](/association_basics.html), you can simply
|
84
84
|
define a reference node between two different fixtures. Here's an example with
|
85
|
-
a belongs_to
|
85
|
+
a `belongs_to`/`has_many` association:
|
86
86
|
|
87
87
|
```yaml
|
88
88
|
# In fixtures/categories.yml
|
@@ -728,7 +728,7 @@ class UserFlowsTest < ActionDispatch::IntegrationTest
|
|
728
728
|
https!(false)
|
729
729
|
get "/articles/all"
|
730
730
|
assert_response :success
|
731
|
-
assert assigns(:
|
731
|
+
assert assigns(:articles)
|
732
732
|
end
|
733
733
|
end
|
734
734
|
```
|
@@ -785,14 +785,13 @@ end
|
|
785
785
|
Rake Tasks for Running your Tests
|
786
786
|
---------------------------------
|
787
787
|
|
788
|
-
|
789
|
-
|
790
|
-
|
791
|
-
when you initiate a Rails project.
|
788
|
+
Rails comes with a number of built-in rake tasks to help with testing. The
|
789
|
+
table below lists the commands included in the default Rakefile when a Rails
|
790
|
+
project is created.
|
792
791
|
|
793
792
|
| Tasks | Description |
|
794
793
|
| ----------------------- | ----------- |
|
795
|
-
| `rake test` | Runs all
|
794
|
+
| `rake test` | Runs all tests in the `test` folder. You can also simply run `rake` as Rails will run all the tests by default |
|
796
795
|
| `rake test:controllers` | Runs all the controller tests from `test/controllers` |
|
797
796
|
| `rake test:functionals` | Runs all the functional tests from `test/controllers`, `test/mailers`, and `test/functional` |
|
798
797
|
| `rake test:helpers` | Runs all the helper tests from `test/helpers` |
|
@@ -801,11 +800,10 @@ when you initiate a Rails project.
|
|
801
800
|
| `rake test:mailers` | Runs all the mailer tests from `test/mailers` |
|
802
801
|
| `rake test:models` | Runs all the model tests from `test/models` |
|
803
802
|
| `rake test:units` | Runs all the unit tests from `test/models`, `test/helpers`, and `test/unit` |
|
804
|
-
| `rake test:
|
805
|
-
| `rake test:all:db` | Runs all tests quickly by merging all types and resetting db |
|
803
|
+
| `rake test:db` | Runs all tests in the `test` folder and resets the db |
|
806
804
|
|
807
805
|
|
808
|
-
Brief Note About
|
806
|
+
A Brief Note About Minitest
|
809
807
|
-----------------------------
|
810
808
|
|
811
809
|
Ruby ships with a vast Standard Library for all common use-cases including testing. Since version 1.9, Ruby provides `Minitest`, a framework for testing. All the basic assertions such as `assert_equal` discussed above are actually defined in `Minitest::Assertions`. The classes `ActiveSupport::TestCase`, `ActionController::TestCase`, `ActionMailer::TestCase`, `ActionView::TestCase` and `ActionDispatch::IntegrationTest` - which we have been inheriting in our test classes - include `Minitest::Assertions`, allowing us to use all of the basic assertions in our tests.
|
@@ -902,11 +900,17 @@ end
|
|
902
900
|
Testing Routes
|
903
901
|
--------------
|
904
902
|
|
905
|
-
Like everything else in your Rails application, it is recommended that you test your routes.
|
903
|
+
Like everything else in your Rails application, it is recommended that you test your routes. Below are example tests for the routes of default `show` and `create` action of `Articles` controller above and it should look like:
|
906
904
|
|
907
905
|
```ruby
|
908
|
-
|
909
|
-
|
906
|
+
class ArticleRoutesTest < ActionController::TestCase
|
907
|
+
test "should route to article" do
|
908
|
+
assert_routing '/articles/1', { controller: "articles", action: "show", id: "1" }
|
909
|
+
end
|
910
|
+
|
911
|
+
test "should route to create article" do
|
912
|
+
assert_routing({ method: 'post', path: '/articles' }, { controller: "articles", action: "create" })
|
913
|
+
end
|
910
914
|
end
|
911
915
|
```
|
912
916
|
|
@@ -1043,6 +1047,68 @@ end
|
|
1043
1047
|
Moreover, since the test class extends from `ActionView::TestCase`, you have
|
1044
1048
|
access to Rails' helper methods such as `link_to` or `pluralize`.
|
1045
1049
|
|
1050
|
+
Testing Jobs
|
1051
|
+
------------
|
1052
|
+
|
1053
|
+
Since your custom jobs can be queued at different levels inside your application,
|
1054
|
+
you'll need to test both jobs themselves (their behavior when they get enqueued)
|
1055
|
+
and that other entities correctly enqueue them.
|
1056
|
+
|
1057
|
+
### A Basic Test Case
|
1058
|
+
|
1059
|
+
By default, when you generate a job, an associated test will be generated as well
|
1060
|
+
under the `test/jobs` directory. Here's an example test with a billing job:
|
1061
|
+
|
1062
|
+
```ruby
|
1063
|
+
require 'test_helper'
|
1064
|
+
|
1065
|
+
class BillingJobTest < ActiveJob::TestCase
|
1066
|
+
test 'that account is charged' do
|
1067
|
+
BillingJob.perform_now(account, product)
|
1068
|
+
assert account.reload.charged_for?(product)
|
1069
|
+
end
|
1070
|
+
end
|
1071
|
+
```
|
1072
|
+
|
1073
|
+
This test is pretty simple and only asserts that the job get the work done
|
1074
|
+
as expected.
|
1075
|
+
|
1076
|
+
By default, `ActiveJob::TestCase` will set the queue adapter to `:test` so that
|
1077
|
+
your jobs are performed inline. It will also ensure that all previously performed
|
1078
|
+
and enqueued jobs are cleared before any test run so you can safely assume that
|
1079
|
+
no jobs have already been executed in the scope of each test.
|
1080
|
+
|
1081
|
+
### Custom Assertions And Testing Jobs Inside Other Components
|
1082
|
+
|
1083
|
+
Active Job ships with a bunch of custom assertions that can be used to lessen
|
1084
|
+
the verbosity of tests:
|
1085
|
+
|
1086
|
+
| Assertion | Purpose |
|
1087
|
+
| -------------------------------------- | ------- |
|
1088
|
+
| `assert_enqueued_jobs(number)` | Asserts that the number of enqueued jobs matches the given number. |
|
1089
|
+
| `assert_performed_jobs(number)` | Asserts that the number of performed jobs matches the given number. |
|
1090
|
+
| `assert_no_enqueued_jobs { ... }` | Asserts that no jobs have been enqueued. |
|
1091
|
+
| `assert_no_performed_jobs { ... }` | Asserts that no jobs have been performed. |
|
1092
|
+
| `assert_enqueued_with([args]) { ... }` | Asserts that the job passed in the block has been enqueued with the given arguments. |
|
1093
|
+
| `assert_performed_with([args]) { ... }`| Asserts that the job passed in the block has been performed with the given arguments. |
|
1094
|
+
|
1095
|
+
It's a good practice to ensure that your jobs correctly get enqueued or performed
|
1096
|
+
wherever you invoke them (e.g. inside your controllers). This is precisely where
|
1097
|
+
the custom assertions provided by Active Job are pretty useful. For instance,
|
1098
|
+
within a model:
|
1099
|
+
|
1100
|
+
```ruby
|
1101
|
+
require 'test_helper'
|
1102
|
+
|
1103
|
+
class ProductTest < ActiveSupport::TestCase
|
1104
|
+
test 'billing job scheduling' do
|
1105
|
+
assert_enqueued_with(job: BillingJob) do
|
1106
|
+
product.charge(account)
|
1107
|
+
end
|
1108
|
+
end
|
1109
|
+
end
|
1110
|
+
```
|
1111
|
+
|
1046
1112
|
Other Testing Approaches
|
1047
1113
|
------------------------
|
1048
1114
|
|
@@ -1054,3 +1120,4 @@ The built-in `minitest` based testing is not the only way to test Rails applicat
|
|
1054
1120
|
* [MiniTest::Spec Rails](https://github.com/metaskills/minitest-spec-rails), use the MiniTest::Spec DSL within your rails tests.
|
1055
1121
|
* [Shoulda](http://www.thoughtbot.com/projects/shoulda), an extension to `test/unit` with additional helpers, macros, and assertions.
|
1056
1122
|
* [RSpec](http://relishapp.com/rspec), a behavior-driven development framework
|
1123
|
+
* [Capybara](http://jnicklas.github.com/capybara/), Acceptance test framework for web applications
|
@@ -50,22 +50,10 @@ Don't forget to review the difference, to see if there were any unexpected chang
|
|
50
50
|
Upgrading from Rails 4.1 to Rails 4.2
|
51
51
|
-------------------------------------
|
52
52
|
|
53
|
-
NOTE: This section is a work in progress, please help to improve this by sending
|
54
|
-
a [pull request](https://github.com/rails/rails/edit/master/guides/source/upgrading_ruby_on_rails.md).
|
55
|
-
|
56
53
|
### Web Console
|
57
54
|
|
58
55
|
First, add `gem 'web-console', '~> 2.0'` to the `:development` group in your Gemfile and run `bundle install` (it won't have been included when you upgraded Rails). Once it's been installed, you can simply drop a reference to the console helper (i.e., `<%= console %>`) into any view you want to enable it for. A console will also be provided on any error page you view in your development environment.
|
59
56
|
|
60
|
-
Additionally, you can tell Rails to automatically mount a VT100-compatible console on a predetermined path by setting the appropriate configuration flags in your development config:
|
61
|
-
|
62
|
-
```ruby
|
63
|
-
# config/environments/development.rb
|
64
|
-
|
65
|
-
config.web_console.automount = true
|
66
|
-
config.web_console.default_mount_path = '/terminal' # Optional, defaults to /console
|
67
|
-
```
|
68
|
-
|
69
57
|
### Responders
|
70
58
|
|
71
59
|
`respond_with` and the class-level `respond_to` methods have been extracted to the `responders` gem. To use them, simply add `gem 'responders', '~> 2.0'` to your Gemfile. Calls to `respond_with` and `respond_to` (again, at the class level) will no longer work without having included the `responders` gem in your dependencies:
|
@@ -145,6 +133,18 @@ assigning `nil` to a serialized attribute will save it to the database
|
|
145
133
|
as `NULL` instead of passing the `nil` value through the coder (e.g. `"null"`
|
146
134
|
when using the `JSON` coder).
|
147
135
|
|
136
|
+
### Production log level
|
137
|
+
|
138
|
+
In Rails 5, the default log level for the production environment will be changed
|
139
|
+
to `:debug` (from `:info`). To preserve the current default, add the following
|
140
|
+
line to your `production.rb`:
|
141
|
+
|
142
|
+
```ruby
|
143
|
+
# Set to `:info` to match the current default, or set to `:debug` to opt-into
|
144
|
+
# the future default.
|
145
|
+
config.log_level = :info
|
146
|
+
```
|
147
|
+
|
148
148
|
### `after_bundle` in Rails templates
|
149
149
|
|
150
150
|
If you have a Rails template that adds all the files in version control, it
|
@@ -181,7 +181,7 @@ end
|
|
181
181
|
|
182
182
|
There's a new choice for sanitizing HTML fragments in your applications. The
|
183
183
|
venerable html-scanner approach is now officially being deprecated in favor of
|
184
|
-
[`Rails
|
184
|
+
[`Rails HTML Sanitizer`](https://github.com/rails/rails-html-sanitizer).
|
185
185
|
|
186
186
|
This means the methods `sanitize`, `sanitize_css`, `strip_tags` and
|
187
187
|
`strip_links` are backed by a new implementation.
|
@@ -207,8 +207,11 @@ gem 'rails-deprecated_sanitizer'
|
|
207
207
|
```
|
208
208
|
|
209
209
|
### Rails DOM Testing
|
210
|
-
The [`TagAssertions` module](http://api.rubyonrails.org/classes/ActionDispatch/Assertions/TagAssertions.html) (containing methods such as `assert_tag`), [has been deprecated](https://github.com/rails/rails/blob/6061472b8c310158a2a2e8e9a6b81a1aef6b60fe/actionpack/lib/action_dispatch/testing/assertions/dom.rb) in favor of the `assert_select` methods from the `SelectorAssertions` module, which has been extracted into the [rails-dom-testing gem](https://github.com/rails/rails-dom-testing).
|
210
|
+
The [`TagAssertions` module](http://api.rubyonrails.org/classes/ActionDispatch/Assertions/TagAssertions.html) (containing methods such as `assert_tag`), [has been deprecated](https://github.com/rails/rails/blob/6061472b8c310158a2a2e8e9a6b81a1aef6b60fe/actionpack/lib/action_dispatch/testing/assertions/dom.rb) in favor of the `assert_select` methods from the `SelectorAssertions` module, which has been extracted into the [rails-dom-testing gem](https://github.com/rails/rails-dom-testing).
|
211
|
+
|
211
212
|
|
213
|
+
### Masked Authenticity Tokens
|
214
|
+
In order to mitigate SSL attacks, `form_authenticity_token` is now masked so that it varies with each request. Thus, tokens are validated by unmasking and then decrypting. As a result, any strategies for verifying requests from non-rails forms that relied on a static session CSRF token have to take this into account.
|
212
215
|
|
213
216
|
Upgrading from Rails 4.0 to Rails 4.1
|
214
217
|
-------------------------------------
|
@@ -233,7 +236,7 @@ will now trigger CSRF protection. Switch to
|
|
233
236
|
xhr :get, :index, format: :js
|
234
237
|
```
|
235
238
|
|
236
|
-
to explicitly test an XmlHttpRequest
|
239
|
+
to explicitly test an `XmlHttpRequest`.
|
237
240
|
|
238
241
|
If you really mean to load JavaScript from remote `<script>` tags, skip CSRF
|
239
242
|
protection on that action.
|
@@ -418,7 +421,7 @@ class ReadOnlyModel < ActiveRecord::Base
|
|
418
421
|
end
|
419
422
|
```
|
420
423
|
|
421
|
-
This
|
424
|
+
This behavior was never intentionally supported. Due to a change in the internals
|
422
425
|
of `ActiveSupport::Callbacks`, this is no longer allowed in Rails 4.1. Using a
|
423
426
|
`return` statement in an inline callback block causes a `LocalJumpError` to
|
424
427
|
be raised when the callback is executed.
|
@@ -588,7 +591,7 @@ response body, you should be using `render :plain` as most browsers will escape
|
|
588
591
|
unsafe content in the response for you.
|
589
592
|
|
590
593
|
We will be deprecating the use of `render :text` in a future version. So please
|
591
|
-
start using the more precise `:plain
|
594
|
+
start using the more precise `:plain`, `:html`, and `:body` options instead.
|
592
595
|
Using `render :text` may pose a security risk, as the content is sent as
|
593
596
|
`text/html`.
|
594
597
|
|
@@ -767,7 +770,7 @@ this gem such as `whitelist_attributes` or `mass_assignment_sanitizer` options.
|
|
767
770
|
* Rails 4.0 has deprecated `ActiveRecord::TestCase` in favor of `ActiveSupport::TestCase`.
|
768
771
|
|
769
772
|
* Rails 4.0 has deprecated the old-style hash based finder API. This means that
|
770
|
-
methods which previously accepted "finder options" no longer do.
|
773
|
+
methods which previously accepted "finder options" no longer do. For example, `Book.find(:all, conditions: { name: '1984' })` has been deprecated in favor of `Book.where(name: '1984')`
|
771
774
|
|
772
775
|
* All dynamic methods except for `find_by_...` and `find_by_...!` are deprecated.
|
773
776
|
Here's how you can handle the changes:
|
@@ -792,7 +795,7 @@ Rails 4.0 extracted Active Resource to its own gem. If you still need the featur
|
|
792
795
|
|
793
796
|
* Rails 4.0 has changed how errors attach with the `ActiveModel::Validations::ConfirmationValidator`. Now when confirmation validations fail, the error will be attached to `:#{attribute}_confirmation` instead of `attribute`.
|
794
797
|
|
795
|
-
* Rails 4.0 has changed `ActiveModel::Serializers::JSON.include_root_in_json` default value to `false`. Now, Active Model Serializers and Active Record objects have the same default
|
798
|
+
* Rails 4.0 has changed `ActiveModel::Serializers::JSON.include_root_in_json` default value to `false`. Now, Active Model Serializers and Active Record objects have the same default behavior. This means that you can comment or remove the following option in the `config/initializers/wrap_parameters.rb` file:
|
796
799
|
|
797
800
|
```ruby
|
798
801
|
# Disable root element in JSON by default.
|
@@ -918,7 +921,7 @@ The order in which helpers from more than one directory are loaded has changed i
|
|
918
921
|
|
919
922
|
### Active Record Observer and Action Controller Sweeper
|
920
923
|
|
921
|
-
|
924
|
+
`ActiveRecord::Observer` and `ActionController::Caching::Sweeper` have been extracted to the `rails-observers` gem. You will need to add the `rails-observers` gem if you require these features.
|
922
925
|
|
923
926
|
### sprockets-rails
|
924
927
|
|