4_2_release_notes.md 21.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Ruby on Rails 4.2 Release Notes
===============================

Highlights in Rails 4.2:

These release notes cover only the major changes. To know about various bug
fixes and changes, please refer to the change logs or check out the
[list of commits](https://github.com/rails/rails/commits/master) in the main
Rails repository on GitHub.

--------------------------------------------------------------------------------

Upgrading to Rails 4.2
----------------------

If you're upgrading an existing application, it's a great idea to have good test
coverage before going in. You should also first upgrade to Rails 4.1 in case you
haven't and make sure your application still runs as expected before attempting
J
Jon Atack 已提交
19
to upgrade to Rails 4.2. A list of things to watch out for when upgrading is
20
available in the
21
[Upgrading Ruby on Rails](upgrading_ruby_on_rails.html#upgrading-from-rails-4.1-to-rails-4.2)
22 23 24 25 26 27
guide.


Major Features
--------------

Y
Yves Senn 已提交
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
### Foreign key support

The migration DSL now supports adding and removing foreign keys. They are dumped
to `schema.rb` as well. At this time, only the `mysql`, `mysql2` and `postgresql`
adapters support foreign keys.

```ruby
# add a foreign key to `articles.author_id` referencing `authors.id`
add_foreign_key :articles, :authors

# add a foreign key to `articles.author_id` referencing `users.lng_id`
add_foreign_key :articles, :users, column: :author_id, primary_key: "lng_id"

# remove the foreign key on `accounts.branch_id`
remove_foreign_key :accounts, :branches

# remove the foreign key on `accounts.owner_id`
remove_foreign_key :accounts, column: :owner_id
```

See the API documentation on
[add_foreign_key](http://api.rubyonrails.org/v4.2.0/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_foreign_key)
and
[remove_foreign_key](http://api.rubyonrails.org/v4.2.0/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-remove_foreign_key)
for a full description.
53 54 55 56 57


Railties
--------

58
Please refer to the [Changelog][railties] for detailed changes.
59 60 61

### Removals

62 63
*   The `rails application` command has been removed without replacement.
    ([Pull Request](https://github.com/rails/rails/pull/11616))
64

65 66
### Deprecations

67 68
*   Deprecated `Rails::Rack::LogTailer` without replacement.
    ([Commit](https://github.com/rails/rails/commit/84a13e019e93efaa8994b3f8303d635a7702dbce))
69

70 71
### Notable changes

72 73 74
*   Introduced `web-console` in the default application Gemfile.
    ([Pull Request](https://github.com/rails/rails/pull/16532))

75 76 77
*   Added a `required` option to the model generator for associations.
    ([Pull Request](https://github.com/rails/rails/pull/16062))

J
Jon Atack 已提交
78
*   Introduced an `after_bundle` callback for use in Rails templates.
79 80
    ([Pull Request](https://github.com/rails/rails/pull/16359))

81
*   Introduced the `x` namespace for defining custom configuration options:
82

G
Godfrey Chan 已提交
83 84
    ```ruby
    # config/environments/production.rb
85 86
    config.x.payment_processing.schedule = :daily
    config.x.payment_processing.retries  = 3
87
    config.x.super_debugger              = true
G
Godfrey Chan 已提交
88
    ```
89 90 91

    These options are then available through the configuration object:

G
Godfrey Chan 已提交
92
    ```ruby
93 94 95
    Rails.configuration.x.payment_processing.schedule # => :daily
    Rails.configuration.x.payment_processing.retries  # => 3
    Rails.configuration.x.super_debugger              # => true
G
Godfrey Chan 已提交
96
    ```
97 98 99 100 101 102

    ([Commit](https://github.com/rails/rails/commit/611849772dd66c2e4d005dcfe153f7ce79a8a7db))

*   Introduced `Rails::Application.config_for` to load a configuration for the
    current environment.

G
Godfrey Chan 已提交
103 104 105 106 107 108 109 110 111 112 113 114 115 116
    ```ruby
    # config/exception_notification.yml:
    production:
      url: http://127.0.0.1:8080
      namespace: my_app_production
    development:
      url: http://localhost:3001
      namespace: my_app_development

    # config/production.rb
    MyApp::Application.configure do
      config.middleware.use ExceptionNotifier, config_for(:exception_notification)
    end
    ```
117 118 119

    ([Pull Request](https://github.com/rails/rails/pull/16129))

J
Jon Atack 已提交
120
*   Introduced a `--skip-gems` option in the app generator to skip gems such as
121 122
    `turbolinks` and `coffee-rails` that does not have their own specific flags.
    ([Commit](https://github.com/rails/rails/commit/10565895805887d4faf004a6f71219da177f78b7))
123

J
Jon Atack 已提交
124 125
*   Introduced a `bin/setup` script to enable automated setup code when
    bootstrapping an application.
126
    ([Pull Request](https://github.com/rails/rails/pull/15189))
127

128 129
*   Changed default value for `config.assets.digest` to `true` in development.
    ([Pull Request](https://github.com/rails/rails/pull/15155))
130

131 132 133 134 135
*   Introduced an API to register new extensions for `rake notes`.
    ([Pull Request](https://github.com/rails/rails/pull/14379))

*   Introduced `Rails.gem_version` as a convenience method to return `Gem::Version.new(Rails.version)`.
    ([Pull Request](https://github.com/rails/rails/pull/14101))
136

137 138 139
*   Introduced an `after_bundle` callback in the Rails templates.
    ([Pull Request](https://github.com/rails/rails/pull/16359))

140 141 142 143

Action Pack
-----------

144
Please refer to the [Changelog][action-pack] for detailed changes.
145

146 147
### Removals

148
*   `respond_with` and the class-level `respond_to` were removed from Rails and
J
Jon Atack 已提交
149 150
    moved to the `responders` gem (version 2.0). Add `gem 'responders', '~> 2.0'`
    to your `Gemfile` to continue using these features.
151 152
    ([Pull Request](https://github.com/rails/rails/pull/16526))

153 154
*   Removed deprecated `AbstractController::Helpers::ClassMethods::MissingHelperError`
    in favor of `AbstractController::Helpers::MissingHelperError`.
155
    ([Commit](https://github.com/rails/rails/commit/a1ddde15ae0d612ff2973de9cf768ed701b594e8))
156

157
### Deprecations
158

159 160 161 162
*   Deprecated `assert_tag`, `assert_no_tag`, `find_tag` and `find_all_tag` in
    favor of `assert_select`.
    ([Commit](https://github.com/rails/rails-dom-testing/commit/b12850bc5ff23ba4b599bf2770874dd4f11bf750))

163 164
*   Deprecated support for setting the `:to` option of a router to a symbol or a
    string that does not contain a `#` character:
165

166 167 168 169 170 171 172 173
    ```ruby
    get '/posts', to: MyRackApp    => (No change necessary)
    get '/posts', to: 'post#index' => (No change necessary)
    get '/posts', to: 'posts'      => get '/posts', controller: :posts
    get '/posts', to: :index       => get '/posts', action: :index
    ```

    ([Commit](https://github.com/rails/rails/commit/cc26b6b7bccf0eea2e2c1a9ebdcc9d30ca7390d9))
174 175 176

### Notable changes

177 178 179
*   Rails will now automatically include the template's digest in ETags.
    ([Pull Request](https://github.com/rails/rails/pull/16527))

180 181 182
*   `render nothing: true` or rendering a `nil` body no longer add a single
    space padding to the response body.
    ([Pull Request](https://github.com/rails/rails/pull/14883))
183

184 185 186 187
*   Introduced the `always_permitted_parameters` option to configure which
    parameters are permitted globally. The default value of this configuration
    is `['controller', 'action']`.
    ([Pull Request](https://github.com/rails/rails/pull/15933))
188

J
Jon Atack 已提交
189 190
*   The `*_filter` family methods have been removed from the documentation. Their
    usage is discouraged in favor of the `*_action` family methods:
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213

    ```
    after_filter          => after_action
    append_after_filter   => append_after_action
    append_around_filter  => append_around_action
    append_before_filter  => append_before_action
    around_filter         => around_action
    before_filter         => before_action
    prepend_after_filter  => prepend_after_action
    prepend_around_filter => prepend_around_action
    prepend_before_filter => prepend_before_action
    skip_after_filter     => skip_after_action
    skip_around_filter    => skip_around_action
    skip_before_filter    => skip_before_action
    skip_filter           => skip_action_callback
    ```

    If your application is depending on these methods, you should use the
    replacement `*_action` methods instead. These methods will be deprecated in
    the future and eventually removed from Rails.

    (Commit [1](https://github.com/rails/rails/commit/6c5f43bab8206747a8591435b2aa0ff7051ad3de),
    [2](https://github.com/rails/rails/commit/489a8f2a44dc9cea09154ee1ee2557d1f037c7d4))
214

215 216
*   Added HTTP method `MKCALENDAR` from RFC-4791
    ([Pull Request](https://github.com/rails/rails/pull/15121))
217

218 219 220
*   `*_fragment.action_controller` notifications now include the controller and action name
    in the payload.
    ([Pull Request](https://github.com/rails/rails/pull/14137))
221

222 223
*   Segments that are passed into URL helpers are now automatically escaped.
    ([Commit](https://github.com/rails/rails/commit/5460591f0226a9d248b7b4f89186bd5553e7768f))
224

J
Jon Atack 已提交
225
*   Improved the Routing Error page with fuzzy matching for route search.
226
    ([Pull Request](https://github.com/rails/rails/pull/14619))
227

J
Jon Atack 已提交
228
*   Added an option to disable logging of CSRF failures.
229
    ([Pull Request](https://github.com/rails/rails/pull/14280))
230 231


232 233 234
Action View
-------------

235
Please refer to the [Changelog][action-view] for detailed changes.
236 237 238

### Deprecations

239 240 241 242
*   Deprecated `AbstractController::Base.parent_prefixes`.
    Override `AbstractController::Base.local_prefixes` when you want to change
    where to find views.
    ([Pull Request](https://github.com/rails/rails/pull/15026))
243

J
Jon Atack 已提交
244 245
*   Deprecated `ActionView::Digestor#digest(name, format, finder, options = {})`.
    Arguments should be passed as a hash instead.
246
    ([Pull Request](https://github.com/rails/rails/pull/14243))
247 248 249

### Notable changes

250
*   Introduced a `#{partial_name}_iteration` special local variable for use with
J
Jon Atack 已提交
251
    partials that are rendered with a collection. It provides access to the
252 253 254 255
    current state of the iteration via the `#index`, `#size`, `#first?` and
    `#last?` methods.
    ([Pull Request](https://github.com/rails/rails/pull/7698))

256 257 258
*   The form helpers no longer generate a `<div>` element with inline CSS around
    the hidden fields.
    ([Pull Request](https://github.com/rails/rails/pull/14738))
259

260

261 262 263
Action Mailer
-------------

264
Please refer to the [Changelog][action-mailer] for detailed changes.
265

266 267 268 269 270
### Deprecations

*   Deprecated `*_path` helpers in mailers. Always use `*_url` helpers instead.
    ([Pull Request](https://github.com/rails/rails/pull/15840))

271 272
### Notable changes

273 274 275 276
*   Introduced `deliver_later` which enqueues a job on the application's queue
    to deliver the mailer asynchronously.
    ([Pull Request](https://github.com/rails/rails/pull/16485))

277 278 279
*   Added the `show_previews` configuration option for enabling mailer previews
    outside of the development environment.
    ([Pull Request](https://github.com/rails/rails/pull/15970))
280

281 282 283 284 285 286 287 288

Active Record
-------------

Please refer to the
[Changelog](https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md)
for detailed changes.

289 290
### Removals

291 292
*   Removed `cache_attributes` and friends. All attributes are cached.
    ([Pull Request](https://github.com/rails/rails/pull/15429))
293

294 295
*   Removed deprecated method `ActiveRecord::Base.quoted_locking_column`.
    ([Pull Request](https://github.com/rails/rails/pull/15612))
296

297 298 299
*   Removed deprecated `ActiveRecord::Migrator.proper_table_name`. Use the
    `proper_table_name` instance method on `ActiveRecord::Migration` instead.
    ([Pull Request](https://github.com/rails/rails/pull/15512))
300

301 302 303 304
*   Removed unused `:timestamp` type. Transparently alias it to `:datetime`
    in all cases. Fixes inconsistencies when column types are sent outside of
    `ActiveRecord`, such as for XML Serialization.
    ([Pull Request](https://github.com/rails/rails/pull/15184))
305

306 307
### Deprecations

G
Godfrey Chan 已提交
308 309 310 311 312 313 314 315 316 317 318
*   Deprecated swallowing of errors inside `after_commit` and `after_rollback`.
    ([Pull Request](https://github.com/rails/rails/pull/16537))

*   Deprecated calling `DatabaseTasks.load_schema` without a connection. Use
    `DatabaseTasks.load_schema_current` instead.
    ([Commit](https://github.com/rails/rails/commit/f15cef67f75e4b52fd45655d7c6ab6b35623c608))

*   Deprecated `Reflection#source_macro` without replacement as it is no longer
    needed in Active Record.
    ([Pull Request](https://github.com/rails/rails/pull/16373))

319 320 321 322 323
*   Deprecated broken support for automatic detection of counter caches on
    `has_many :through` associations. You should instead manually specify the
    counter cache on the `has_many` and `belongs_to` associations for the
    through records.
    ([Pull Request](https://github.com/rails/rails/pull/15754))
324

325 326
*   Deprecated `serialized_attributes` without replacement.
    ([Pull Request](https://github.com/rails/rails/pull/15704))
327

328 329 330
*   Deprecated returning `nil` from `column_for_attribute` when no column
    exists. It will return a null object in Rails 5.0
    ([Pull Request](https://github.com/rails/rails/pull/15878))
331

332 333 334 335
*   Deprecated using `.joins`, `.preload` and `.eager_load` with associations
    that depends on the instance state (i.e. those defined with a scope that
    takes an argument) without replacement.
    ([Commit](https://github.com/rails/rails/commit/ed56e596a0467390011bc9d56d462539776adac1))
336

337 338 339 340
*   Deprecated passing Active Record objects to `.find` or `.exists?`. Call
    `#id` on the objects first.
    (Commit [1](https://github.com/rails/rails/commit/d92ae6ccca3bcfd73546d612efaea011270bd270),
    [2](https://github.com/rails/rails/commit/d35f0033c7dec2b8d8b52058fb8db495d49596f7))
341

342 343 344 345
*   Deprecated half-baked support for PostgreSQL range values with excluding
    beginnings. We currently map PostgreSQL ranges to Ruby ranges. This conversion
    is not fully possible because the Ruby range does not support excluded
    beginnings.
346

347 348 349 350
    The current solution of incrementing the beginning is not correct
    and is now deprecated. For subtypes where we don't know how to increment
    (e.g. `#succ` is not defined) it will raise an `ArgumentError` for ranges
    with excluding beginnings.
351

352
    ([Commit](https://github.com/rails/rails/commit/91949e48cf41af9f3e4ffba3e5eecf9b0a08bfc3))
353

354 355
### Notable changes

G
Godfrey Chan 已提交
356 357 358 359 360 361 362
*   The PostgreSQL adapter now supports the `JSONB` datatype in PostgreSQL 9.4+.
    ([Pull Request](https://github.com/rails/rails/pull/16220))

*   The `#references` method in migrations now supports a `type` option for
    specifying the type of the foreign key (e.g. `:uuid`).
    ([Pull Request](https://github.com/rails/rails/pull/16231))

363 364 365
*   Added a `:required` option to singular associations, which defines a
    presence validation on the association.
    ([Pull Request](https://github.com/rails/rails/pull/16056))
366

367 368 369
*   Introduced `ActiveRecord::Base#validate!` that raises `RecordInvalid` if the
    record is invalid.
    ([Pull Request](https://github.com/rails/rails/pull/8639))
370

371 372 373 374
*   `ActiveRecord::Base#reload` now behaves the same as `m = Model.find(m.id)`,
    meaning that it no longer retains the extra attributes from custom
    `select`s.
    ([Pull Request](https://github.com/rails/rails/pull/15866))
375

376 377 378
*   Introduced the `bin/rake db:purge` task to empty the database for the
    current environment.
    ([Commit](https://github.com/rails/rails/commit/e2f232aba15937a4b9d14bd91e0392c6d55be58d))
379

380 381 382 383 384 385 386
*   `ActiveRecord::Dirty` now detects in-place changes to mutable values.
    Serialized attributes on ActiveRecord models will no longer save when
    unchanged. This also works with other types such as string columns and json
    columns on PostgreSQL.
    (Pull Requests [1](https://github.com/rails/rails/pull/15674),
    [2](https://github.com/rails/rails/pull/15786),
    [3](https://github.com/rails/rails/pull/15788))
387

388 389
*   Added support for `#pretty_print` in `ActiveRecord::Base` objects.
    ([Pull Request](https://github.com/rails/rails/pull/15172))
390

391 392 393
*   PostgreSQL and SQLite adapters no longer add a default limit of 255
    characters on string columns.
    ([Pull Request](https://github.com/rails/rails/pull/14579))
394

395 396 397 398 399
*   `sqlite3:///some/path` now resolves to the absolute system path
    `/some/path`. For relative paths, use `sqlite3:some/path` instead.
    (Previously, `sqlite3:///some/path` resolved to the relative path
    `some/path`. This behaviour was deprecated on Rails 4.1.)
    ([Pull Request](https://github.com/rails/rails/pull/14569))
400

401 402
*   Introduced `#validate` as an alias for `#valid?`.
    ([Pull Request](https://github.com/rails/rails/pull/14456))
403

404 405
*   `#touch` now accepts multiple attributes to be touched at once.
    ([Pull Request](https://github.com/rails/rails/pull/14423))
406

407 408 409
*   Added support for fractional seconds for MySQL 5.6 and above.
    (Pull Request [1](https://github.com/rails/rails/pull/8240),
    [2](https://github.com/rails/rails/pull/14359))
410

411 412
*   Added support for the `citext` column type in PostgreSQL adapter.
    ([Pull Request](https://github.com/rails/rails/pull/12523))
413

414 415
*   Added support for user-created range types in PostgreSQL adapter.
    ([Commit](https://github.com/rails/rails/commit/4cb47167e747e8f9dc12b0ddaf82bdb68c03e032))
416

417

418 419 420
Active Model
------------

421
Please refer to the [Changelog][active-model] for detailed changes.
422

423 424
### Removals

425
*   Removed deprecated `Validator#setup` without replacement.
426 427 428 429 430 431 432 433 434
    ([Pull Request](https://github.com/rails/rails/pull/10716))

### Deprecations

*   Deprecated reset_#{attribute} in favor of restore_#{attribute}.
    ([Pull Request](https://github.com/rails/rails/pull/16180))

*   Deprecated ActiveModel::Dirty#reset_changes in favor of #clear_changes_information.
    ([Pull Request](https://github.com/rails/rails/pull/16180))
435

436 437
### Notable changes

438 439 440 441 442 443 444
*   Introduced the `restore_attributes` method in `ActiveModel::Dirty` to restore
    the changed (dirty) attributes to their previous values.
    (Pull Request [1](https://github.com/rails/rails/pull/14861), [2](https://github.com/rails/rails/pull/16180))

*   `has_secure_password` no longer disallow blank passwords (i.e. passwords
    that contains only spaces) by default.
    ([Pull Request](https://github.com/rails/rails/pull/16412))
445

446 447 448
*   `has_secure_password` now verifies that the given password is less than 72
    characters if validations are enabled.
    ([Pull Request](https://github.com/rails/rails/pull/15708))
449

450 451
*   Introduced `#validate` as an alias for `#valid?`.
    ([Pull Request](https://github.com/rails/rails/pull/14456))
452 453 454 455 456


Active Support
--------------

457
Please refer to the [Changelog][active-support] for detailed changes.
458 459 460

### Removals

461 462 463
*   Removed deprecated `Numeric#ago`, `Numeric#until`, `Numeric#since`,
    `Numeric#from_now`.
    ([Commit](https://github.com/rails/rails/commit/f1eddea1e3f6faf93581c43651348f48b2b7d8bb))
464

465 466
*   Removed deprecated string based terminators for `ActiveSupport::Callbacks`.
    ([Pull Request](https://github.com/rails/rails/pull/15100))
467 468 469

### Deprecations

470 471 472 473
*   Deprecated `Kernel#silence_stderr`, `Kernel#capture` and `Kernel#quietly`
    without replacement.
    ([Pull Request](https://github.com/rails/rails/pull/13392))

474 475 476
*   Deprecated `Class#superclass_delegating_accessor`, use
    `Class#class_attribute` instead.
    ([Pull Request](https://github.com/rails/rails/pull/14271))
477

478 479 480
*   Deprecated `ActiveSupport::SafeBuffer#prepend!` as
    `ActiveSupport::SafeBuffer#prepend` now performs the same function.
    ([Pull Request](https://github.com/rails/rails/pull/14529))
481 482 483

### Notable changes

484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500
*   The `travel_to` test helper now truncates the `usec` component to 0.
    ([Commit](https://github.com/rails/rails/commit/9f6e82ee4783e491c20f5244a613fdeb4024beb5))

*   `ActiveSupport::TestCase` now randomizes the order that test cases are ran
    by default.
    ([Commit](https://github.com/rails/rails/commit/6ffb29d24e05abbd9ffe3ea974140d6c70221807))

*   Introduced `Object#itself` as an identity function.
    (Commit [1](https://github.com/rails/rails/commit/702ad710b57bef45b081ebf42e6fa70820fdd810),
    [2](https://github.com/rails/rails/commit/64d91122222c11ad3918cc8e2e3ebc4b0a03448a))

*   `Object#with_options` can now be used without an explicit receiver.
    ([Pull Request](https://github.com/rails/rails/pull/16339))

*   Introduced `String#truncate_words` to truncate a string by a number of words.
    ([Pull Request](https://github.com/rails/rails/pull/16190))

501 502 503 504
*   Added `Hash#transform_values` and `Hash#transform_values!` to simplify a
    common pattern where the values of a hash must change, but the keys are left
    the same.
    ([Pull Request](https://github.com/rails/rails/pull/15819))
505

506 507
*   The `humanize` inflector helper now strips any leading underscores.
    ([Commit](https://github.com/rails/rails/commit/daaa21bc7d20f2e4ff451637423a25ff2d5e75c7))
508

J
Jon Atack 已提交
509
*   Introduced `Concern#class_methods` as an alternative to
510 511 512
    `module ClassMethods`, as well as `Kernel#concern` to avoid the
    `module Foo; extend ActiveSupport::Concern; end` boilerplate.
    ([Commit](https://github.com/rails/rails/commit/b16c36e688970df2f96f793a759365b248b582ad))
513

514

515 516 517 518 519
Credits
-------

See the
[full list of contributors to Rails](http://contributors.rubyonrails.org/) for
520 521
the many people who spent many hours making Rails the stable and robust
framework it is today. Kudos to all of them.
522 523 524 525 526 527 528 529

[railties]:       https://github.com/rails/rails/blob/4-2-stable/railties/CHANGELOG.md
[action-pack]:    https://github.com/rails/rails/blob/4-2-stable/actionpack/CHANGELOG.md
[action-view]:    https://github.com/rails/rails/blob/4-2-stable/actionview/CHANGELOG.md
[action-mailer]:  https://github.com/rails/rails/blob/4-2-stable/actionmailer/CHANGELOG.md
[active-record]:  https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md
[active-model]:   https://github.com/rails/rails/blob/4-2-stable/activemodel/CHANGELOG.md
[active-support]: https://github.com/rails/rails/blob/4-2-stable/activesupport/CHANGELOG.md