4_2_release_notes.md 18.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
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
an update to Rails 4.2. A list of things to watch out for when upgrading is
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 75 76 77 78 79
*   Added a `required` option to the model generator for associations.
    ([Pull Request](https://github.com/rails/rails/pull/16062))

*   Introduced an `after_bundle` callbacks for use in Rails templates.
    ([Pull Request](https://github.com/rails/rails/pull/16359))

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

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

    These options are then available through the configuration object:

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

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

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

G
Godfrey Chan 已提交
101 102 103 104 105 106 107 108 109 110 111 112 113 114
    ```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
    ```
115 116 117

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

118 119 120
*   Introduced `--skip-gems` option in the app generator to skip gems such as
    `turbolinks` and `coffee-rails` that does not have their own specific flags.
    ([Commit](https://github.com/rails/rails/commit/10565895805887d4faf004a6f71219da177f78b7))
121

122 123
*   Introduced `bin/setup` script to bootstrap an application.
    ([Pull Request](https://github.com/rails/rails/pull/15189))
124

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

128 129 130 131 132
*   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))
133

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

137 138 139 140

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

141
Please refer to the [Changelog][action-pack] for detailed changes.
142

143 144
### Removals

145 146 147 148 149
*   `respond_with` and the class-level `respond_to` were removed from Rails and
    moved to the `responders` gem (version 2.0). Add it to your `Gemfile` to
    continue using these features.
    ([Pull Request](https://github.com/rails/rails/pull/16526))

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

154
### Deprecations
155

156 157 158 159
*   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))

160 161
*   Deprecated support for setting the `:to` option of a router to a symbol or a
    string that does not contain a `#` character:
162

163 164 165 166 167 168 169 170
    ```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))
171 172 173

### Notable changes

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

177 178 179
*   `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))
180

181 182 183 184
*   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))
185

186 187
*   The `*_filter` family methods has been removed from the documentation. Their
    usage are discouraged in favor of the `*_action` family methods:
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210

    ```
    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))
211

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

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

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

222 223
*   Improved Routing Error page with fuzzy matching for route search.
    ([Pull Request](https://github.com/rails/rails/pull/14619))
224

225 226
*   Added option to disable logging of CSRF failures.
    ([Pull Request](https://github.com/rails/rails/pull/14280))
227 228


229 230 231
Action View
-------------

232
Please refer to the [Changelog][action-view] for detailed changes.
233 234 235

### Deprecations

236 237 238 239
*   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))
240

241 242 243
*   Deprecated `ActionView::Digestor#digest(name, format, finder, options = {})`,
    arguments should be passed as a hash instead.
    ([Pull Request](https://github.com/rails/rails/pull/14243))
244 245 246

### Notable changes

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

253 254 255
*   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))
256

257

258 259 260
Action Mailer
-------------

261
Please refer to the [Changelog][action-mailer] for detailed changes.
262

263 264 265 266 267
### Deprecations

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

268 269
### Notable changes

270 271 272 273
*   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))

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

278 279 280 281 282 283 284 285

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

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

286 287
### Removals

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

291 292
*   Removed deprecated method `ActiveRecord::Base.quoted_locking_column`.
    ([Pull Request](https://github.com/rails/rails/pull/15612))
293

294 295 296
*   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))
297

298 299 300 301
*   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))
302

303 304
### Deprecations

305 306 307 308 309
*   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))
310

311 312
*   Deprecated `serialized_attributes` without replacement.
    ([Pull Request](https://github.com/rails/rails/pull/15704))
313

314 315 316
*   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))
317

318 319 320 321
*   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))
322

323 324 325 326
*   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))
327

328 329 330 331
*   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.
332

333 334 335 336
    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.
337

338
    ([Commit](https://github.com/rails/rails/commit/91949e48cf41af9f3e4ffba3e5eecf9b0a08bfc3))
339

340 341
### Notable changes

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

346 347 348
*   Introduced `ActiveRecord::Base#validate!` that raises `RecordInvalid` if the
    record is invalid.
    ([Pull Request](https://github.com/rails/rails/pull/8639))
349

350 351 352 353
*   `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))
354

355 356 357
*   Introduced the `bin/rake db:purge` task to empty the database for the
    current environment.
    ([Commit](https://github.com/rails/rails/commit/e2f232aba15937a4b9d14bd91e0392c6d55be58d))
358

359 360 361 362 363 364 365
*   `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))
366

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

370 371 372
*   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))
373

374 375 376 377 378
*   `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))
379

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

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

386 387 388
*   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))
389

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

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

396

397 398 399
Active Model
------------

400
Please refer to the [Changelog][active-model] for detailed changes.
401

402 403
### Removals

404 405
*   Removed deprecated `Validator#setup` without replacement.
    ([Pull Request](https://github.com/rails/rails/pull/15617))
406

407 408
### Notable changes

409 410 411
*   Introduced `undo_changes` method in `ActiveModel::Dirty` to restore the
    changed (dirty) attributes to their previous values.
    ([Pull Request](https://github.com/rails/rails/pull/14861))
412

413 414 415
*   `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))
416

417 418
*   Introduced `#validate` as an alias for `#valid?`.
    ([Pull Request](https://github.com/rails/rails/pull/14456))
419 420 421 422 423


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

424
Please refer to the [Changelog][active-support] for detailed changes.
425 426 427

### Removals

428 429 430
*   Removed deprecated `Numeric#ago`, `Numeric#until`, `Numeric#since`,
    `Numeric#from_now`.
    ([Commit](https://github.com/rails/rails/commit/f1eddea1e3f6faf93581c43651348f48b2b7d8bb))
431

432 433
*   Removed deprecated string based terminators for `ActiveSupport::Callbacks`.
    ([Pull Request](https://github.com/rails/rails/pull/15100))
434 435 436

### Deprecations

437 438 439
*   Deprecated `Class#superclass_delegating_accessor`, use
    `Class#class_attribute` instead.
    ([Pull Request](https://github.com/rails/rails/pull/14271))
440

441 442 443
*   Deprecated `ActiveSupport::SafeBuffer#prepend!` as
    `ActiveSupport::SafeBuffer#prepend` now performs the same function.
    ([Pull Request](https://github.com/rails/rails/pull/14529))
444 445 446

### Notable changes

447 448 449 450
*   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))
451

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

455 456 457 458
*   Introduce `Concern#class_methods` as an alternative to
    `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))
459

460

461 462 463 464 465
Credits
-------

See the
[full list of contributors to Rails](http://contributors.rubyonrails.org/) for
466 467
the many people who spent many hours making Rails the stable and robust
framework it is today. Kudos to all of them.
468 469 470 471 472 473 474 475

[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