rails 4.1.4 → 4.2.11.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +12 -10
- data/guides/CHANGELOG.md +87 -15
- data/guides/Rakefile +21 -6
- data/guides/assets/images/getting_started/article_with_comments.png +0 -0
- data/guides/assets/javascripts/guides.js +6 -0
- data/guides/assets/stylesheets/main.css +4 -1
- data/guides/bug_report_templates/action_controller_gem.rb +3 -3
- data/guides/bug_report_templates/action_controller_master.rb +3 -2
- data/guides/bug_report_templates/active_record_gem.rb +1 -1
- data/guides/bug_report_templates/generic_gem.rb +15 -0
- data/guides/bug_report_templates/generic_master.rb +26 -0
- data/guides/rails_guides/helpers.rb +1 -1
- data/guides/rails_guides/levenshtein.rb +27 -21
- data/guides/rails_guides/markdown/renderer.rb +1 -1
- data/guides/rails_guides/markdown.rb +11 -7
- data/guides/rails_guides.rb +2 -2
- data/guides/source/2_2_release_notes.md +1 -1
- data/guides/source/2_3_release_notes.md +4 -4
- data/guides/source/3_0_release_notes.md +8 -8
- data/guides/source/3_1_release_notes.md +6 -3
- data/guides/source/3_2_release_notes.md +6 -3
- data/guides/source/4_0_release_notes.md +6 -3
- data/guides/source/4_1_release_notes.md +10 -11
- data/guides/source/4_2_release_notes.md +877 -0
- data/guides/source/_license.html.erb +1 -1
- data/guides/source/_welcome.html.erb +6 -8
- data/guides/source/action_controller_overview.md +28 -11
- data/guides/source/action_mailer_basics.md +97 -29
- data/guides/source/action_view_overview.md +142 -191
- data/guides/source/active_job_basics.md +339 -0
- data/guides/source/active_model_basics.md +371 -17
- data/guides/source/active_record_basics.md +25 -24
- data/guides/source/active_record_callbacks.md +12 -9
- data/guides/source/{migrations.md → active_record_migrations.md} +135 -226
- data/guides/source/active_record_postgresql.md +433 -0
- data/guides/source/active_record_querying.md +270 -262
- data/guides/source/active_record_validations.md +24 -14
- data/guides/source/active_support_core_extensions.md +115 -123
- data/guides/source/active_support_instrumentation.md +10 -18
- data/guides/source/api_documentation_guidelines.md +63 -17
- data/guides/source/asset_pipeline.md +266 -125
- data/guides/source/association_basics.md +96 -80
- data/guides/source/autoloading_and_reloading_constants.md +1311 -0
- data/guides/source/caching_with_rails.md +32 -7
- data/guides/source/command_line.md +52 -30
- data/guides/source/configuring.md +161 -33
- data/guides/source/contributing_to_ruby_on_rails.md +198 -114
- data/guides/source/credits.html.erb +2 -2
- data/guides/source/debugging_rails_applications.md +448 -294
- data/guides/source/development_dependencies_install.md +47 -36
- data/guides/source/documents.yaml +19 -7
- data/guides/source/engines.md +217 -196
- data/guides/source/form_helpers.md +79 -56
- data/guides/source/generators.md +24 -11
- data/guides/source/getting_started.md +361 -222
- data/guides/source/i18n.md +113 -69
- data/guides/source/index.html.erb +1 -0
- data/guides/source/initialization.md +110 -63
- data/guides/source/layout.html.erb +5 -11
- data/guides/source/layouts_and_rendering.md +26 -26
- data/guides/source/maintenance_policy.md +26 -4
- data/guides/source/nested_model_forms.md +7 -4
- data/guides/source/plugins.md +27 -27
- data/guides/source/rails_application_templates.md +21 -3
- data/guides/source/rails_on_rack.md +12 -10
- data/guides/source/routing.md +115 -75
- data/guides/source/ruby_on_rails_guides_guidelines.md +11 -12
- data/guides/source/security.md +41 -35
- data/guides/source/testing.md +199 -119
- data/guides/source/upgrading_ruby_on_rails.md +319 -32
- data/guides/source/working_with_javascript_in_rails.md +19 -17
- data/guides/w3c_validator.rb +2 -0
- metadata +42 -95
- data/guides/code/getting_started/Gemfile +0 -40
- data/guides/code/getting_started/Gemfile.lock +0 -125
- data/guides/code/getting_started/README.rdoc +0 -28
- data/guides/code/getting_started/Rakefile +0 -6
- data/guides/code/getting_started/app/assets/javascripts/application.js +0 -15
- data/guides/code/getting_started/app/assets/javascripts/comments.js.coffee +0 -3
- data/guides/code/getting_started/app/assets/javascripts/posts.js.coffee +0 -3
- data/guides/code/getting_started/app/assets/javascripts/welcome.js.coffee +0 -3
- data/guides/code/getting_started/app/assets/stylesheets/application.css +0 -13
- data/guides/code/getting_started/app/assets/stylesheets/comments.css.scss +0 -3
- data/guides/code/getting_started/app/assets/stylesheets/posts.css.scss +0 -3
- data/guides/code/getting_started/app/assets/stylesheets/welcome.css.scss +0 -3
- data/guides/code/getting_started/app/controllers/application_controller.rb +0 -5
- data/guides/code/getting_started/app/controllers/comments_controller.rb +0 -23
- data/guides/code/getting_started/app/controllers/posts_controller.rb +0 -53
- data/guides/code/getting_started/app/controllers/welcome_controller.rb +0 -4
- data/guides/code/getting_started/app/helpers/application_helper.rb +0 -2
- data/guides/code/getting_started/app/helpers/comments_helper.rb +0 -2
- data/guides/code/getting_started/app/helpers/posts_helper.rb +0 -2
- data/guides/code/getting_started/app/helpers/welcome_helper.rb +0 -2
- data/guides/code/getting_started/app/models/comment.rb +0 -3
- data/guides/code/getting_started/app/models/post.rb +0 -7
- data/guides/code/getting_started/app/views/comments/_comment.html.erb +0 -15
- data/guides/code/getting_started/app/views/comments/_form.html.erb +0 -13
- data/guides/code/getting_started/app/views/layouts/application.html.erb +0 -14
- data/guides/code/getting_started/app/views/posts/_form.html.erb +0 -27
- data/guides/code/getting_started/app/views/posts/edit.html.erb +0 -5
- data/guides/code/getting_started/app/views/posts/index.html.erb +0 -21
- data/guides/code/getting_started/app/views/posts/new.html.erb +0 -5
- data/guides/code/getting_started/app/views/posts/show.html.erb +0 -18
- data/guides/code/getting_started/app/views/welcome/index.html.erb +0 -4
- data/guides/code/getting_started/bin/bundle +0 -4
- data/guides/code/getting_started/bin/rails +0 -4
- data/guides/code/getting_started/bin/rake +0 -4
- data/guides/code/getting_started/config/application.rb +0 -18
- data/guides/code/getting_started/config/boot.rb +0 -4
- data/guides/code/getting_started/config/database.yml +0 -25
- data/guides/code/getting_started/config/environment.rb +0 -5
- data/guides/code/getting_started/config/environments/development.rb +0 -30
- data/guides/code/getting_started/config/environments/production.rb +0 -80
- data/guides/code/getting_started/config/environments/test.rb +0 -36
- data/guides/code/getting_started/config/initializers/backtrace_silencers.rb +0 -7
- data/guides/code/getting_started/config/initializers/filter_parameter_logging.rb +0 -4
- data/guides/code/getting_started/config/initializers/inflections.rb +0 -16
- data/guides/code/getting_started/config/initializers/locale.rb +0 -9
- data/guides/code/getting_started/config/initializers/mime_types.rb +0 -5
- data/guides/code/getting_started/config/initializers/secret_token.rb +0 -12
- data/guides/code/getting_started/config/initializers/session_store.rb +0 -3
- data/guides/code/getting_started/config/initializers/wrap_parameters.rb +0 -14
- data/guides/code/getting_started/config/locales/en.yml +0 -23
- data/guides/code/getting_started/config/routes.rb +0 -7
- data/guides/code/getting_started/config.ru +0 -4
- data/guides/code/getting_started/db/migrate/20130122042648_create_posts.rb +0 -10
- data/guides/code/getting_started/db/migrate/20130122045842_create_comments.rb +0 -11
- data/guides/code/getting_started/db/schema.rb +0 -33
- data/guides/code/getting_started/db/seeds.rb +0 -7
- data/guides/code/getting_started/public/404.html +0 -60
- data/guides/code/getting_started/public/422.html +0 -60
- data/guides/code/getting_started/public/500.html +0 -59
- data/guides/code/getting_started/public/favicon.ico +0 -0
- data/guides/code/getting_started/public/robots.txt +0 -5
- data/guides/code/getting_started/test/controllers/comments_controller_test.rb +0 -7
- data/guides/code/getting_started/test/controllers/posts_controller_test.rb +0 -7
- data/guides/code/getting_started/test/controllers/welcome_controller_test.rb +0 -9
- data/guides/code/getting_started/test/fixtures/comments.yml +0 -11
- data/guides/code/getting_started/test/fixtures/posts.yml +0 -9
- data/guides/code/getting_started/test/helpers/comments_helper_test.rb +0 -4
- data/guides/code/getting_started/test/helpers/posts_helper_test.rb +0 -4
- data/guides/code/getting_started/test/helpers/welcome_helper_test.rb +0 -4
- data/guides/code/getting_started/test/models/comment_test.rb +0 -7
- data/guides/code/getting_started/test/models/post_test.rb +0 -7
- data/guides/code/getting_started/test/test_helper.rb +0 -12
@@ -3,10 +3,12 @@ A Guide for Upgrading Ruby on Rails
|
|
3
3
|
|
4
4
|
This guide provides steps to be followed when you upgrade your applications to a newer version of Ruby on Rails. These steps are also available in individual release guides.
|
5
5
|
|
6
|
+
--------------------------------------------------------------------------------
|
7
|
+
|
6
8
|
General Advice
|
7
9
|
--------------
|
8
10
|
|
9
|
-
Before attempting to upgrade an existing application, you should be sure you have a good reason to upgrade. You need to balance
|
11
|
+
Before attempting to upgrade an existing application, you should be sure you have a good reason to upgrade. You need to balance several factors: the need for new features, the increasing difficulty of finding support for old code, and your available time and skills, to name a few.
|
10
12
|
|
11
13
|
### Test Coverage
|
12
14
|
|
@@ -22,6 +24,246 @@ Rails generally stays close to the latest released Ruby version when it's releas
|
|
22
24
|
|
23
25
|
TIP: Ruby 1.8.7 p248 and p249 have marshaling bugs that crash Rails. Ruby Enterprise Edition has these fixed since the release of 1.8.7-2010.02. On the 1.9 front, Ruby 1.9.1 is not usable because it outright segfaults, so if you want to use 1.9.x, jump straight to 1.9.3 for smooth sailing.
|
24
26
|
|
27
|
+
### The Rake Task
|
28
|
+
|
29
|
+
Rails provides the `rails:update` rake task. After updating the Rails version
|
30
|
+
in the Gemfile, run this rake task.
|
31
|
+
This will help you with the creation of new files and changes of old files in an
|
32
|
+
interactive session.
|
33
|
+
|
34
|
+
```bash
|
35
|
+
$ rake rails:update
|
36
|
+
identical config/boot.rb
|
37
|
+
exist config
|
38
|
+
conflict config/routes.rb
|
39
|
+
Overwrite /myapp/config/routes.rb? (enter "h" for help) [Ynaqdh]
|
40
|
+
force config/routes.rb
|
41
|
+
conflict config/application.rb
|
42
|
+
Overwrite /myapp/config/application.rb? (enter "h" for help) [Ynaqdh]
|
43
|
+
force config/application.rb
|
44
|
+
conflict config/environment.rb
|
45
|
+
...
|
46
|
+
```
|
47
|
+
|
48
|
+
Don't forget to review the difference, to see if there were any unexpected changes.
|
49
|
+
|
50
|
+
Upgrading from Rails 4.1 to Rails 4.2
|
51
|
+
-------------------------------------
|
52
|
+
|
53
|
+
### Web Console
|
54
|
+
|
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.
|
56
|
+
|
57
|
+
### Responders
|
58
|
+
|
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:
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
# app/controllers/users_controller.rb
|
63
|
+
|
64
|
+
class UsersController < ApplicationController
|
65
|
+
respond_to :html, :json
|
66
|
+
|
67
|
+
def show
|
68
|
+
@user = User.find(params[:id])
|
69
|
+
respond_with @user
|
70
|
+
end
|
71
|
+
end
|
72
|
+
```
|
73
|
+
|
74
|
+
Instance-level `respond_to` is unaffected and does not require the additional gem:
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
# app/controllers/users_controller.rb
|
78
|
+
|
79
|
+
class UsersController < ApplicationController
|
80
|
+
def show
|
81
|
+
@user = User.find(params[:id])
|
82
|
+
respond_to do |format|
|
83
|
+
format.html
|
84
|
+
format.json { render json: @user }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
```
|
89
|
+
|
90
|
+
See [#16526](https://github.com/rails/rails/pull/16526) for more details.
|
91
|
+
|
92
|
+
### Error handling in transaction callbacks
|
93
|
+
|
94
|
+
Currently, Active Record suppresses errors raised
|
95
|
+
within `after_rollback` or `after_commit` callbacks and only prints them to
|
96
|
+
the logs. In the next version, these errors will no longer be suppressed.
|
97
|
+
Instead, the errors will propagate normally just like in other Active
|
98
|
+
Record callbacks.
|
99
|
+
|
100
|
+
When you define a `after_rollback` or `after_commit` callback, you
|
101
|
+
will receive a deprecation warning about this upcoming change. When
|
102
|
+
you are ready, you can opt into the new behavior and remove the
|
103
|
+
deprecation warning by adding following configuration to your
|
104
|
+
`config/application.rb`:
|
105
|
+
|
106
|
+
config.active_record.raise_in_transactional_callbacks = true
|
107
|
+
|
108
|
+
See [#14488](https://github.com/rails/rails/pull/14488) and
|
109
|
+
[#16537](https://github.com/rails/rails/pull/16537) for more details.
|
110
|
+
|
111
|
+
### Ordering of test cases
|
112
|
+
|
113
|
+
In Rails 5.0, test cases will be executed in random order by default. In
|
114
|
+
anticipation of this change, Rails 4.2 introduced a new configuration option
|
115
|
+
`active_support.test_order` for explicitly specifying the test ordering. This
|
116
|
+
allows you to either lock down the current behavior by setting the option to
|
117
|
+
`:sorted`, or opt into the future behavior by setting the option to `:random`.
|
118
|
+
|
119
|
+
If you do not specify a value for this option, a deprecation warning will be
|
120
|
+
emitted. To avoid this, add the following line to your test environment:
|
121
|
+
|
122
|
+
```ruby
|
123
|
+
# config/environments/test.rb
|
124
|
+
Rails.application.configure do
|
125
|
+
config.active_support.test_order = :sorted # or `:random` if you prefer
|
126
|
+
end
|
127
|
+
```
|
128
|
+
|
129
|
+
### Serialized attributes
|
130
|
+
|
131
|
+
When using a custom coder (e.g. `serialize :metadata, JSON`),
|
132
|
+
assigning `nil` to a serialized attribute will save it to the database
|
133
|
+
as `NULL` instead of passing the `nil` value through the coder (e.g. `"null"`
|
134
|
+
when using the `JSON` coder).
|
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
|
+
### `after_bundle` in Rails templates
|
149
|
+
|
150
|
+
If you have a Rails template that adds all the files in version control, it
|
151
|
+
fails to add the generated binstubs because it gets executed before Bundler:
|
152
|
+
|
153
|
+
```ruby
|
154
|
+
# template.rb
|
155
|
+
generate(:scaffold, "person name:string")
|
156
|
+
route "root to: 'people#index'"
|
157
|
+
rake("db:migrate")
|
158
|
+
|
159
|
+
git :init
|
160
|
+
git add: "."
|
161
|
+
git commit: %Q{ -m 'Initial commit' }
|
162
|
+
```
|
163
|
+
|
164
|
+
You can now wrap the `git` calls in an `after_bundle` block. It will be run
|
165
|
+
after the binstubs have been generated.
|
166
|
+
|
167
|
+
```ruby
|
168
|
+
# template.rb
|
169
|
+
generate(:scaffold, "person name:string")
|
170
|
+
route "root to: 'people#index'"
|
171
|
+
rake("db:migrate")
|
172
|
+
|
173
|
+
after_bundle do
|
174
|
+
git :init
|
175
|
+
git add: "."
|
176
|
+
git commit: %Q{ -m 'Initial commit' }
|
177
|
+
end
|
178
|
+
```
|
179
|
+
|
180
|
+
### Rails HTML Sanitizer
|
181
|
+
|
182
|
+
There's a new choice for sanitizing HTML fragments in your applications. The
|
183
|
+
venerable html-scanner approach is now officially being deprecated in favor of
|
184
|
+
[`Rails HTML Sanitizer`](https://github.com/rails/rails-html-sanitizer).
|
185
|
+
|
186
|
+
This means the methods `sanitize`, `sanitize_css`, `strip_tags` and
|
187
|
+
`strip_links` are backed by a new implementation.
|
188
|
+
|
189
|
+
This new sanitizer uses [Loofah](https://github.com/flavorjones/loofah) internally. Loofah in turn uses Nokogiri, which
|
190
|
+
wraps XML parsers written in both C and Java, so sanitization should be faster
|
191
|
+
no matter which Ruby version you run.
|
192
|
+
|
193
|
+
The new version updates `sanitize`, so it can take a `Loofah::Scrubber` for
|
194
|
+
powerful scrubbing.
|
195
|
+
[See some examples of scrubbers here](https://github.com/flavorjones/loofah#loofahscrubber).
|
196
|
+
|
197
|
+
Two new scrubbers have also been added: `PermitScrubber` and `TargetScrubber`.
|
198
|
+
Read the [gem's readme](https://github.com/rails/rails-html-sanitizer) for more information.
|
199
|
+
|
200
|
+
The documentation for `PermitScrubber` and `TargetScrubber` explains how you
|
201
|
+
can gain complete control over when and how elements should be stripped.
|
202
|
+
|
203
|
+
If your application needs to use the old sanitizer implementation, include `rails-deprecated_sanitizer` in your Gemfile:
|
204
|
+
|
205
|
+
```ruby
|
206
|
+
gem 'rails-deprecated_sanitizer'
|
207
|
+
```
|
208
|
+
|
209
|
+
### Rails DOM Testing
|
210
|
+
|
211
|
+
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).
|
212
|
+
|
213
|
+
|
214
|
+
### Masked Authenticity Tokens
|
215
|
+
|
216
|
+
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.
|
217
|
+
|
218
|
+
### Action Mailer
|
219
|
+
|
220
|
+
Previously, calling a mailer method on a mailer class will result in the
|
221
|
+
corresponding instance method being executed directly. With the introduction of
|
222
|
+
Active Job and `#deliver_later`, this is no longer true. In Rails 4.2, the
|
223
|
+
invocation of the instance methods are deferred until either `deliver_now` or
|
224
|
+
`deliver_later` is called. For example:
|
225
|
+
|
226
|
+
```ruby
|
227
|
+
class Notifier < ActionMailer::Base
|
228
|
+
def notify(user, ...)
|
229
|
+
puts "Called"
|
230
|
+
mail(to: user.email, ...)
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
mail = Notifier.notify(user, ...) # Notifier#welcome is not yet called at this point
|
235
|
+
mail = mail.deliver_now # Prints "Called"
|
236
|
+
```
|
237
|
+
|
238
|
+
This should not result in any noticible differnces for most applications.
|
239
|
+
However, if you need some non-mailer methods to be exectuted synchronously, and
|
240
|
+
you were previously relying on the synchronous proxying behavior, you should
|
241
|
+
define them as class methods on the mailer class directly:
|
242
|
+
|
243
|
+
```ruby
|
244
|
+
class Notifier < ActionMailer::Base
|
245
|
+
def self.broadcast_notifications(users, ...)
|
246
|
+
users.each { |user| Notifier.notify(user, ...) }
|
247
|
+
end
|
248
|
+
end
|
249
|
+
```
|
250
|
+
|
251
|
+
### Foreign Key Support
|
252
|
+
|
253
|
+
The migration DSL has been expanded to support foreign key definitions. If
|
254
|
+
you've been using the Foreigner gem, you might want to consider removing it.
|
255
|
+
Note that the foreign key support of Rails is a subset of Foreigner. This means
|
256
|
+
that not every Foreigner definition can be fully replaced by it's Rails
|
257
|
+
migration DSL counterpart.
|
258
|
+
|
259
|
+
The migration procedure is as follows:
|
260
|
+
|
261
|
+
1. remove `gem "foreigner"` from the Gemfile.
|
262
|
+
2. run `bundle install`.
|
263
|
+
3. run `bin/rake db:schema:dump`.
|
264
|
+
4. make sure that `db/schema.rb` contains every foreign key definition with
|
265
|
+
the necessary options.
|
266
|
+
|
25
267
|
Upgrading from Rails 4.0 to Rails 4.1
|
26
268
|
-------------------------------------
|
27
269
|
|
@@ -30,7 +272,7 @@ Upgrading from Rails 4.0 to Rails 4.1
|
|
30
272
|
Or, "whaaat my tests are failing!!!?"
|
31
273
|
|
32
274
|
Cross-site request forgery (CSRF) protection now covers GET requests with
|
33
|
-
JavaScript responses, too.
|
275
|
+
JavaScript responses, too. This prevents a third-party site from referencing
|
34
276
|
your JavaScript URL and attempting to run it to extract sensitive data.
|
35
277
|
|
36
278
|
This means that your functional and integration tests that use
|
@@ -45,7 +287,7 @@ will now trigger CSRF protection. Switch to
|
|
45
287
|
xhr :get, :index, format: :js
|
46
288
|
```
|
47
289
|
|
48
|
-
to explicitly test an XmlHttpRequest
|
290
|
+
to explicitly test an `XmlHttpRequest`.
|
49
291
|
|
50
292
|
If you really mean to load JavaScript from remote `<script>` tags, skip CSRF
|
51
293
|
protection on that action.
|
@@ -81,11 +323,11 @@ secrets, you need to:
|
|
81
323
|
```
|
82
324
|
|
83
325
|
2. Use your existing `secret_key_base` from the `secret_token.rb` initializer to
|
84
|
-
set the SECRET_KEY_BASE environment variable for whichever users
|
85
|
-
|
86
|
-
`secret_key_base` from the `secret_token.rb` initializer to `secrets.yml`
|
326
|
+
set the SECRET_KEY_BASE environment variable for whichever users running the
|
327
|
+
Rails application in production mode. Alternatively, you can simply copy the existing
|
328
|
+
`secret_key_base` from the `secret_token.rb` initializer to `secrets.yml`
|
87
329
|
under the `production` section, replacing '<%= ENV["SECRET_KEY_BASE"] %>'.
|
88
|
-
|
330
|
+
|
89
331
|
3. Remove the `secret_token.rb` initializer.
|
90
332
|
|
91
333
|
4. Use `rake secret` to generate new keys for the `development` and `test` sections.
|
@@ -96,7 +338,7 @@ secrets, you need to:
|
|
96
338
|
|
97
339
|
If your test helper contains a call to
|
98
340
|
`ActiveRecord::Migration.check_pending!` this can be removed. The check
|
99
|
-
is now done automatically when you `require 'test_help'`, although
|
341
|
+
is now done automatically when you `require 'rails/test_help'`, although
|
100
342
|
leaving this line in your helper is not harmful in any way.
|
101
343
|
|
102
344
|
### Cookies serializer
|
@@ -140,7 +382,7 @@ If you use the cookie session store, this would apply to the `session` and
|
|
140
382
|
|
141
383
|
Flash message keys are
|
142
384
|
[normalized to strings](https://github.com/rails/rails/commit/a668beffd64106a1e1fedb71cc25eaaa11baf0c1). They
|
143
|
-
can still be accessed using either symbols or strings.
|
385
|
+
can still be accessed using either symbols or strings. Looping through the flash
|
144
386
|
will always yield string keys:
|
145
387
|
|
146
388
|
```ruby
|
@@ -210,6 +452,16 @@ If your application depends on one of these features, you can get them back by
|
|
210
452
|
adding the [`activesupport-json_encoder`](https://github.com/rails/activesupport-json_encoder)
|
211
453
|
gem to your Gemfile.
|
212
454
|
|
455
|
+
#### JSON representation of Time objects
|
456
|
+
|
457
|
+
`#as_json` for objects with time component (`Time`, `DateTime`, `ActiveSupport::TimeWithZone`)
|
458
|
+
now returns millisecond precision by default. If you need to keep old behavior with no millisecond
|
459
|
+
precision, set the following in an initializer:
|
460
|
+
|
461
|
+
```
|
462
|
+
ActiveSupport::JSON::Encoding.time_precision = 0
|
463
|
+
```
|
464
|
+
|
213
465
|
### Usage of `return` within inline callback blocks
|
214
466
|
|
215
467
|
Previously, Rails allowed inline callback blocks to use `return` this way:
|
@@ -220,7 +472,7 @@ class ReadOnlyModel < ActiveRecord::Base
|
|
220
472
|
end
|
221
473
|
```
|
222
474
|
|
223
|
-
This
|
475
|
+
This behavior was never intentionally supported. Due to a change in the internals
|
224
476
|
of `ActiveSupport::Callbacks`, this is no longer allowed in Rails 4.1. Using a
|
225
477
|
`return` statement in an inline callback block causes a `LocalJumpError` to
|
226
478
|
be raised when the callback is executed.
|
@@ -265,7 +517,7 @@ included in the newly introduced `ActiveRecord::FixtureSet.context_class`, in
|
|
265
517
|
`test_helper.rb`.
|
266
518
|
|
267
519
|
```ruby
|
268
|
-
|
520
|
+
module FixtureFileHelpers
|
269
521
|
def file_sha(path)
|
270
522
|
Digest::SHA2.hexdigest(File.read(Rails.root.join('test/fixtures', path)))
|
271
523
|
end
|
@@ -275,8 +527,8 @@ ActiveRecord::FixtureSet.context_class.send :include, FixtureFileHelpers
|
|
275
527
|
|
276
528
|
### I18n enforcing available locales
|
277
529
|
|
278
|
-
Rails 4.1 now defaults the I18n option `enforce_available_locales` to `true
|
279
|
-
|
530
|
+
Rails 4.1 now defaults the I18n option `enforce_available_locales` to `true`. This
|
531
|
+
means that it will make sure that all locales passed to it must be declared in
|
280
532
|
the `available_locales` list.
|
281
533
|
|
282
534
|
To disable it (and allow I18n to accept *any* locale option) add the following
|
@@ -286,9 +538,10 @@ configuration to your application:
|
|
286
538
|
config.i18n.enforce_available_locales = false
|
287
539
|
```
|
288
540
|
|
289
|
-
Note that this option was added as a security measure, to ensure user input
|
290
|
-
|
291
|
-
to disable this option unless you have a strong reason for
|
541
|
+
Note that this option was added as a security measure, to ensure user input
|
542
|
+
cannot be used as locale information unless it is previously known. Therefore,
|
543
|
+
it's recommended not to disable this option unless you have a strong reason for
|
544
|
+
doing so.
|
292
545
|
|
293
546
|
### Mutator methods called on Relation
|
294
547
|
|
@@ -309,10 +562,10 @@ authors.compact!
|
|
309
562
|
|
310
563
|
### Changes on Default Scopes
|
311
564
|
|
312
|
-
Default scopes are no longer
|
565
|
+
Default scopes are no longer overridden by chained conditions.
|
313
566
|
|
314
567
|
In previous versions when you defined a `default_scope` in a model
|
315
|
-
it was
|
568
|
+
it was overridden by chained conditions in the same field. Now it
|
316
569
|
is merged like any other scope.
|
317
570
|
|
318
571
|
Before:
|
@@ -389,18 +642,32 @@ response body, you should be using `render :plain` as most browsers will escape
|
|
389
642
|
unsafe content in the response for you.
|
390
643
|
|
391
644
|
We will be deprecating the use of `render :text` in a future version. So please
|
392
|
-
start using the more precise `:plain
|
645
|
+
start using the more precise `:plain`, `:html`, and `:body` options instead.
|
393
646
|
Using `render :text` may pose a security risk, as the content is sent as
|
394
647
|
`text/html`.
|
395
648
|
|
396
649
|
### PostgreSQL json and hstore datatypes
|
397
650
|
|
398
651
|
Rails 4.1 will map `json` and `hstore` columns to a string-keyed Ruby `Hash`.
|
399
|
-
In earlier versions a `HashWithIndifferentAccess` was used. This means that
|
652
|
+
In earlier versions, a `HashWithIndifferentAccess` was used. This means that
|
400
653
|
symbol access is no longer supported. This is also the case for
|
401
654
|
`store_accessors` based on top of `json` or `hstore` columns. Make sure to use
|
402
655
|
string keys consistently.
|
403
656
|
|
657
|
+
### Explicit block use for `ActiveSupport::Callbacks`
|
658
|
+
|
659
|
+
Rails 4.1 now expects an explicit block to be passed when calling
|
660
|
+
`ActiveSupport::Callbacks.set_callback`. This change stems from
|
661
|
+
`ActiveSupport::Callbacks` being largely rewritten for the 4.1 release.
|
662
|
+
|
663
|
+
```ruby
|
664
|
+
# Previously in Rails 4.0
|
665
|
+
set_callback :save, :around, ->(r, &block) { stuff; result = block.call; stuff }
|
666
|
+
|
667
|
+
# Now in Rails 4.1
|
668
|
+
set_callback :save, :around, ->(r, block) { stuff; result = block.call; stuff }
|
669
|
+
```
|
670
|
+
|
404
671
|
Upgrading from Rails 3.2 to Rails 4.0
|
405
672
|
-------------------------------------
|
406
673
|
|
@@ -472,7 +739,7 @@ being used, you can update your form to use the `PUT` method instead:
|
|
472
739
|
<%= form_for [ :update_name, @user ], method: :put do |f| %>
|
473
740
|
```
|
474
741
|
|
475
|
-
For more on PATCH and why this change was made, see [this post](http://weblog.rubyonrails.org/2012/2/
|
742
|
+
For more on PATCH and why this change was made, see [this post](http://weblog.rubyonrails.org/2012/2/26/edge-rails-patch-is-the-new-primary-http-method-for-updates/)
|
476
743
|
on the Rails blog.
|
477
744
|
|
478
745
|
#### A note about media types
|
@@ -488,7 +755,7 @@ def update
|
|
488
755
|
respond_to do |format|
|
489
756
|
format.json do
|
490
757
|
# perform a partial update
|
491
|
-
@
|
758
|
+
@article.update params[:article]
|
492
759
|
end
|
493
760
|
|
494
761
|
format.json_patch do
|
@@ -515,7 +782,7 @@ file (in `config/application.rb`):
|
|
515
782
|
```ruby
|
516
783
|
# Require the gems listed in Gemfile, including any gems
|
517
784
|
# you've limited to :test, :development, or :production.
|
518
|
-
Bundler.require(
|
785
|
+
Bundler.require(*Rails.groups)
|
519
786
|
```
|
520
787
|
|
521
788
|
### vendor/plugins
|
@@ -526,12 +793,15 @@ Rails 4.0 no longer supports loading plugins from `vendor/plugins`. You must rep
|
|
526
793
|
|
527
794
|
* Rails 4.0 has removed the identity map from Active Record, due to [some inconsistencies with associations](https://github.com/rails/rails/commit/302c912bf6bcd0fa200d964ec2dc4a44abe328a6). If you have manually enabled it in your application, you will have to remove the following config that has no effect anymore: `config.active_record.identity_map`.
|
528
795
|
|
529
|
-
* The `delete` method in collection associations can now receive `
|
796
|
+
* The `delete` method in collection associations can now receive `Integer` or `String` arguments as record ids, besides records, pretty much like the `destroy` method does. Previously it raised `ActiveRecord::AssociationTypeMismatch` for such arguments. From Rails 4.0 on `delete` automatically tries to find the records matching the given ids before deleting them.
|
530
797
|
|
531
798
|
* In Rails 4.0 when a column or a table is renamed the related indexes are also renamed. If you have migrations which rename the indexes, they are no longer needed.
|
532
799
|
|
533
800
|
* Rails 4.0 has changed `serialized_attributes` and `attr_readonly` to class methods only. You shouldn't use instance methods since it's now deprecated. You should change them to use class methods, e.g. `self.serialized_attributes` to `self.class.serialized_attributes`.
|
534
801
|
|
802
|
+
* When using the default coder, assigning `nil` to a serialized attribute will save it
|
803
|
+
to the database as `NULL` instead of passing the `nil` value through YAML (`"--- \n...\n"`).
|
804
|
+
|
535
805
|
* Rails 4.0 has removed `attr_accessible` and `attr_protected` feature in favor of Strong Parameters. You can use the [Protected Attributes gem](https://github.com/rails/protected_attributes) for a smooth upgrade path.
|
536
806
|
|
537
807
|
* If you are not using Protected Attributes, you can remove any options related to
|
@@ -551,7 +821,7 @@ this gem such as `whitelist_attributes` or `mass_assignment_sanitizer` options.
|
|
551
821
|
* Rails 4.0 has deprecated `ActiveRecord::TestCase` in favor of `ActiveSupport::TestCase`.
|
552
822
|
|
553
823
|
* Rails 4.0 has deprecated the old-style hash based finder API. This means that
|
554
|
-
methods which previously accepted "finder options" no longer do.
|
824
|
+
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')`
|
555
825
|
|
556
826
|
* All dynamic methods except for `find_by_...` and `find_by_...!` are deprecated.
|
557
827
|
Here's how you can handle the changes:
|
@@ -568,6 +838,20 @@ this gem such as `whitelist_attributes` or `mass_assignment_sanitizer` options.
|
|
568
838
|
|
569
839
|
* To re-enable the old finders, you can use the [activerecord-deprecated_finders gem](https://github.com/rails/activerecord-deprecated_finders).
|
570
840
|
|
841
|
+
* Rails 4.0 has changed to default join table for `has_and_belongs_to_many` relations to strip the common prefix off the second table name. Any existing `has_and_belongs_to_many` relationship between models with a common prefix must be specified with the `join_table` option. For example:
|
842
|
+
|
843
|
+
```ruby
|
844
|
+
CatalogCategory < ActiveRecord::Base
|
845
|
+
has_and_belongs_to_many :catalog_products, join_table: 'catalog_categories_catalog_products'
|
846
|
+
end
|
847
|
+
|
848
|
+
CatalogProduct < ActiveRecord::Base
|
849
|
+
has_and_belongs_to_many :catalog_categories, join_table: 'catalog_categories_catalog_products'
|
850
|
+
end
|
851
|
+
```
|
852
|
+
|
853
|
+
* Note that the the prefix takes scopes into account as well, so relations between `Catalog::Category` and `Catalog::Product` or `Catalog::Category` and `CatalogProduct` need to be updated similarly.
|
854
|
+
|
571
855
|
### Active Resource
|
572
856
|
|
573
857
|
Rails 4.0 extracted Active Resource to its own gem. If you still need the feature you can add the [Active Resource gem](https://github.com/rails/activeresource) in your Gemfile.
|
@@ -576,7 +860,7 @@ Rails 4.0 extracted Active Resource to its own gem. If you still need the featur
|
|
576
860
|
|
577
861
|
* 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`.
|
578
862
|
|
579
|
-
* 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
|
863
|
+
* 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:
|
580
864
|
|
581
865
|
```ruby
|
582
866
|
# Disable root element in JSON by default.
|
@@ -611,6 +895,8 @@ Please read [Pull Request #9978](https://github.com/rails/rails/pull/9978) for d
|
|
611
895
|
|
612
896
|
* Rails 4.0 has removed the XML parameters parser. You will need to add the `actionpack-xml_parser` gem if you require this feature.
|
613
897
|
|
898
|
+
* Rails 4.0 changes the default `layout` lookup set using symbols or procs that return nil. To get the "no layout" behavior, return false instead of nil.
|
899
|
+
|
614
900
|
* Rails 4.0 changes the default memcached client from `memcache-client` to `dalli`. To upgrade, simply add `gem 'dalli'` to your `Gemfile`.
|
615
901
|
|
616
902
|
* Rails 4.0 deprecates the `dom_id` and `dom_class` methods in controllers (they are fine in views). You will need to include the `ActionView::RecordIdentifier` module in controllers requiring this feature.
|
@@ -702,7 +988,7 @@ The order in which helpers from more than one directory are loaded has changed i
|
|
702
988
|
|
703
989
|
### Active Record Observer and Action Controller Sweeper
|
704
990
|
|
705
|
-
|
991
|
+
`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.
|
706
992
|
|
707
993
|
### sprockets-rails
|
708
994
|
|
@@ -720,17 +1006,18 @@ config.assets.js_compressor = :uglifier
|
|
720
1006
|
Upgrading from Rails 3.1 to Rails 3.2
|
721
1007
|
-------------------------------------
|
722
1008
|
|
723
|
-
If your application is currently on any version of Rails older than 3.1.x, you
|
1009
|
+
If your application is currently on any version of Rails older than 3.1.x, you
|
1010
|
+
should upgrade to Rails 3.1 before attempting an update to Rails 3.2.
|
724
1011
|
|
725
|
-
The following changes are meant for upgrading your application to
|
726
|
-
|
1012
|
+
The following changes are meant for upgrading your application to the latest
|
1013
|
+
3.2.x version of Rails.
|
727
1014
|
|
728
1015
|
### Gemfile
|
729
1016
|
|
730
1017
|
Make the following changes to your `Gemfile`.
|
731
1018
|
|
732
1019
|
```ruby
|
733
|
-
gem 'rails', '3.2.
|
1020
|
+
gem 'rails', '3.2.18'
|
734
1021
|
|
735
1022
|
group :assets do
|
736
1023
|
gem 'sass-rails', '~> 3.2.6'
|
@@ -855,7 +1142,7 @@ You can help test performance with these additions to your test environment:
|
|
855
1142
|
|
856
1143
|
```ruby
|
857
1144
|
# Configure static asset server for tests with Cache-Control for performance
|
858
|
-
config.
|
1145
|
+
config.serve_static_files = true
|
859
1146
|
config.static_cache_control = 'public, max-age=3600'
|
860
1147
|
```
|
861
1148
|
|
@@ -111,7 +111,9 @@ paintIt = (element, backgroundColor, textColor) ->
|
|
111
111
|
element.style.color = textColor
|
112
112
|
|
113
113
|
$ ->
|
114
|
-
$("a[data-background-color]").click ->
|
114
|
+
$("a[data-background-color]").click (e) ->
|
115
|
+
e.preventDefault()
|
116
|
+
|
115
117
|
backgroundColor = $(this).data("background-color")
|
116
118
|
textColor = $(this).data("text-color")
|
117
119
|
paintIt(this, backgroundColor, textColor)
|
@@ -156,7 +158,7 @@ is a helper that assists with writing forms. `form_for` takes a `:remote`
|
|
156
158
|
option. It works like this:
|
157
159
|
|
158
160
|
```erb
|
159
|
-
<%= form_for(@
|
161
|
+
<%= form_for(@article, remote: true) do |f| %>
|
160
162
|
...
|
161
163
|
<% end %>
|
162
164
|
```
|
@@ -164,7 +166,7 @@ option. It works like this:
|
|
164
166
|
This will generate the following HTML:
|
165
167
|
|
166
168
|
```html
|
167
|
-
<form accept-charset="UTF-8" action="/
|
169
|
+
<form accept-charset="UTF-8" action="/articles" class="new_article" data-remote="true" id="new_article" method="post">
|
168
170
|
...
|
169
171
|
</form>
|
170
172
|
```
|
@@ -178,10 +180,10 @@ bind to the `ajax:success` event. On failure, use `ajax:error`. Check it out:
|
|
178
180
|
|
179
181
|
```coffeescript
|
180
182
|
$(document).ready ->
|
181
|
-
$("#
|
182
|
-
$("#
|
183
|
+
$("#new_article").on("ajax:success", (e, data, status, xhr) ->
|
184
|
+
$("#new_article").append xhr.responseText
|
183
185
|
).on "ajax:error", (e, xhr, status, error) ->
|
184
|
-
$("#
|
186
|
+
$("#new_article").append "<p>ERROR</p>"
|
185
187
|
```
|
186
188
|
|
187
189
|
Obviously, you'll want to be a bit more sophisticated than that, but it's a
|
@@ -194,7 +196,7 @@ is very similar to `form_for`. It has a `:remote` option that you can use like
|
|
194
196
|
this:
|
195
197
|
|
196
198
|
```erb
|
197
|
-
<%= form_tag('/
|
199
|
+
<%= form_tag('/articles', remote: true) do %>
|
198
200
|
...
|
199
201
|
<% end %>
|
200
202
|
```
|
@@ -202,7 +204,7 @@ this:
|
|
202
204
|
This will generate the following HTML:
|
203
205
|
|
204
206
|
```html
|
205
|
-
<form accept-charset="UTF-8" action="/
|
207
|
+
<form accept-charset="UTF-8" action="/articles" data-remote="true" method="post">
|
206
208
|
...
|
207
209
|
</form>
|
208
210
|
```
|
@@ -217,21 +219,21 @@ is a helper that assists with generating links. It has a `:remote` option you
|
|
217
219
|
can use like this:
|
218
220
|
|
219
221
|
```erb
|
220
|
-
<%= link_to "
|
222
|
+
<%= link_to "an article", @article, remote: true %>
|
221
223
|
```
|
222
224
|
|
223
225
|
which generates
|
224
226
|
|
225
227
|
```html
|
226
|
-
<a href="/
|
228
|
+
<a href="/articles/1" data-remote="true">an article</a>
|
227
229
|
```
|
228
230
|
|
229
231
|
You can bind to the same Ajax events as `form_for`. Here's an example. Let's
|
230
|
-
assume that we have a list of
|
232
|
+
assume that we have a list of articles that can be deleted with just one
|
231
233
|
click. We would generate some HTML like this:
|
232
234
|
|
233
235
|
```erb
|
234
|
-
<%= link_to "Delete
|
236
|
+
<%= link_to "Delete article", @article, remote: true, method: :delete %>
|
235
237
|
```
|
236
238
|
|
237
239
|
and write some CoffeeScript like this:
|
@@ -239,7 +241,7 @@ and write some CoffeeScript like this:
|
|
239
241
|
```coffeescript
|
240
242
|
$ ->
|
241
243
|
$("a[data-remote]").on "ajax:success", (e, data, status, xhr) ->
|
242
|
-
alert "The
|
244
|
+
alert "The article was deleted."
|
243
245
|
```
|
244
246
|
|
245
247
|
### button_to
|
@@ -247,14 +249,14 @@ $ ->
|
|
247
249
|
[`button_to`](http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-button_to) is a helper that helps you create buttons. It has a `:remote` option that you can call like this:
|
248
250
|
|
249
251
|
```erb
|
250
|
-
<%= button_to "
|
252
|
+
<%= button_to "An article", @article, remote: true %>
|
251
253
|
```
|
252
254
|
|
253
255
|
this generates
|
254
256
|
|
255
257
|
```html
|
256
|
-
<form action="/
|
257
|
-
<div><input type="submit" value="
|
258
|
+
<form action="/articles/1" class="button_to" data-remote="true" method="post">
|
259
|
+
<div><input type="submit" value="An article"></div>
|
258
260
|
</form>
|
259
261
|
```
|
260
262
|
|
@@ -353,7 +355,7 @@ This gem uses Ajax to speed up page rendering in most applications.
|
|
353
355
|
|
354
356
|
Turbolinks attaches a click handler to all `<a>` on the page. If your browser
|
355
357
|
supports
|
356
|
-
[PushState](https://developer.mozilla.org/en-US/docs/DOM/Manipulating_the_browser_history#The_pushState
|
358
|
+
[PushState](https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history#The_pushState%28%29_method),
|
357
359
|
Turbolinks will make an Ajax request for the page, parse the response, and
|
358
360
|
replace the entire `<body>` of the page with the `<body>` of the response. It
|
359
361
|
will then use PushState to change the URL to the correct one, preserving
|
data/guides/w3c_validator.rb
CHANGED
@@ -60,6 +60,8 @@ module RailsGuides
|
|
60
60
|
def guides_to_validate
|
61
61
|
guides = Dir["./output/*.html"]
|
62
62
|
guides.delete("./output/layout.html")
|
63
|
+
guides.delete("./output/_license.html")
|
64
|
+
guides.delete("./output/_welcome.html")
|
63
65
|
ENV.key?('ONLY') ? select_only(guides) : guides
|
64
66
|
end
|
65
67
|
|