CHANGELOG.md 15.3 KB
Newer Older
1 2 3 4 5 6 7 8
*   Fix regression in mounted engine named routes generation for app deployed to
    a subdirectory. `relative_url_root` was prepended to the path twice (e.g.
    "/subdir/subdir/engine_path" instead of "/subdir/engine_path")

    Fixes #20920. Fixes #21459.

    *Matthew Erhard*

9 10 11 12 13
*   ActionDispatch::Response#new no longer applies default headers.  If you want
    default headers applied to the response object, then call
    `ActionDispatch::Response.create`.  This change only impacts people who are
    directly constructing an `ActionDispatch::Response` object.

14 15 16 17 18 19 20
*   Accessing mime types via constants like `Mime::HTML` is deprecated.  Please
    change code like this:

      Mime::HTML

    To this:

21
      Mime[:html]
22 23 24 25 26

    This change is so that Rails will not manage a list of constants, and fixes
    an issue where if a type isn't registered you could possibly get the wrong
    object.

27 28 29 30
    `Mime[:html]` is available in older versions of Rails, too, so you can
    safely change libraries and plugins and maintain compatibility with
    multiple versions of Rails.

31 32 33 34
*   `url_for` does not modify its arguments when generating polymorphic URLs.

    *Bernerd Schaefer*

35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
*   Make it easier to opt in to `config.force_ssl` and `config.ssl_options` by
    making them less dangerous to try and easier to disable.

    SSL redirect:
      * Move `:host` and `:port` options within `redirect: { … }`. Deprecate.
      * Introduce `:status` and `:body` to customize the redirect response.
        The 301 permanent default makes it difficult to test the redirect and
        back out of it since browsers remember the 301. Test with a 302 or 307
        instead, then switch to 301 once you're confident that all is well.

    HTTP Strict Transport Security (HSTS):
      * Shorter max-age. Shorten the default max-age from 1 year to 180 days,
        the low end for https://www.ssllabs.com/ssltest/ grading and greater
        than the 18-week minimum to qualify for browser preload lists.
      * Disabling HSTS. Setting `hsts: false` now sets `hsts { expires: 0 }`
        instead of omitting the header. Omitting does nothing to disable HSTS
        since browsers hang on to your previous settings until they expire.
        Sending `{ hsts: { expires: 0 }}` flushes out old browser settings and
        actually disables HSTS:
          http://tools.ietf.org/html/rfc6797#section-6.1.1
      * HSTS Preload. Introduce `preload: true` to set the `preload` flag,
        indicating that your site may be included in browser preload lists,
        including Chrome, Firefox, Safari, IE11, and Edge. Submit your site:
          https://hstspreload.appspot.com

    *Jeremy Daer*

Y
Yves Senn 已提交
62 63
*   Update `ActionController::TestSession#fetch` to behave more like
    `ActionDispatch::Request::Session#fetch` when using non-string keys.
64 65 66

    *Jeremy Friesen*

67 68 69 70 71 72 73 74 75
*   Using strings or symbols for middleware class names is deprecated.  Convert
    things like this:

      middleware.use "Foo::Bar"

    to this:

      middleware.use Foo::Bar

76 77 78 79 80 81 82 83 84
*   ActionController::TestSession now accepts a default value as well as
    a block for generating a default value based off the key provided.

    This fixes calls to session#fetch in ApplicationController instances that
    take more two arguments or a block from raising `ArgumentError: wrong
    number of arguments (2 for 1)` when performing controller tests.

    *Matthew Gerrior*

85 86 87 88 89
*   Fix `ActionController::Parameters#fetch` overwriting `KeyError` returned by
    default block.

    *Jonas Schuber Erlandsson*, *Roque Pinel*

90 91 92 93 94 95 96 97
*   `ActionController::Parameters` no longer inherits from
    `HashWithIndifferentAccess`

    Inheriting from `HashWithIndifferentAccess` allowed users to call any
    enumerable methods on `Parameters` object, resulting in a risk of losing the
    `permitted?` status or even getting back a pure `Hash` object instead of
    a `Parameters` object with proper sanitization.

98
    By not inheriting from `HashWithIndifferentAccess`, we are able to make
99 100 101 102 103
    sure that all methods that are defined in `Parameters` object will return
    a proper `Parameters` object with a correct `permitted?` flag.

    *Prem Sichanugrist*

104 105 106 107 108
*   Replaced `ActiveSupport::Concurrency::Latch` with `Concurrent::CountDownLatch`
    from the concurrent-ruby gem.

    *Jerry D'Antonio*

109 110 111 112 113 114 115 116 117 118
*   Add ability to filter parameters based on parent keys.

        # matches {credit_card: {code: "xxxx"}}
        # doesn't match {file: { code: "xxxx"}}
        config.filter_parameters += [ "credit_card.code" ]

    See #13897.

    *Guillaume Malette*

119 120 121 122
*   Deprecate passing first parameter as `Hash` and default status code for `head` method.

    *Mehmet Emin İNAÇ*

123 124 125 126 127 128
*   Adds`Rack::Utils::ParameterTypeError` and `Rack::Utils::InvalidParameterError`
    to the rescue_responses hash in `ExceptionWrapper` (Rack recommends
    integrators serve 400s for both of these).

    *Grey Baker*

129 130 131 132 133 134
*   Add support for API only apps.
    ActionController::API is added as a replacement of
    ActionController::Base for this kind of applications.

    *Santiago Pastorino & Jorge Bejar*

135 136 137 138 139 140 141
*   Remove `assigns` and `assert_template`. Both methods have been extracted
    into a gem at https://github.com/rails/rails-controller-testing.

    See #18950.

    *Alan Guo Xiang Tan*

142 143 144 145 146 147 148 149
*   `FileHandler` and `Static` middleware initializers accept `index` argument
    to configure the directory index file name. Defaults to `index` (as in
    `index.html`).

    See #20017.

    *Eliot Sykes*

150 151 152 153
*   Deprecate `:nothing` option for `render` method.

    *Mehmet Emin İNAÇ*

154
*   Fix `rake routes` not showing the right format when
155 156 157 158 159 160
    nesting multiple routes.

    See #18373.

    *Ravil Bayramgalin*

161 162 163 164 165 166 167 168
*   Add ability to override default form builder for a controller.

        class AdminController < ApplicationController
          default_form_builder AdminFormBuilder
        end

    *Kevin McPhillips*

169 170 171 172 173 174 175 176
*   For actions with no corresponding templates, render `head :no_content`
    instead of raising an error. This allows for slimmer API controller
    methods that simply work, without needing further instructions.

    See #19036.

    *Stephen Bussey*

177 178 179 180 181 182 183 184 185 186 187 188 189 190
*   Provide friendlier access to request variants.

        request.variant = :phone
        request.variant.phone?  # true
        request.variant.tablet? # false

        request.variant = [:phone, :tablet]
        request.variant.phone?                  # true
        request.variant.desktop?                # false
        request.variant.any?(:phone, :desktop)  # true
        request.variant.any?(:desktop, :watch)  # false

    *George Claghorn*

A
Arthur Neves 已提交
191 192 193 194 195 196 197
*   Fix regression where a gzip file response would have a Content-type,
    even when it was a 304 status code.

    See #19271.

    *Kohei Suzuki*

Y
Yves Senn 已提交
198
*   Fix handling of empty `X_FORWARDED_HOST` header in `raw_host_with_port`.
199

Y
Yves Senn 已提交
200 201 202
    Previously, an empty `X_FORWARDED_HOST` header would cause
    `Actiondispatch::Http:URL.raw_host_with_port` to return `nil`, causing
    `Actiondispatch::Http:URL.host` to raise a `NoMethodError`.
203 204 205

    *Adam Forsyth*

P
phoet 已提交
206 207 208 209 210 211 212 213 214 215
*   Allow `Bearer` as token-keyword in `Authorization-Header`.

    Aditionally to `Token`, the keyword `Bearer` is acceptable as a keyword
    for the auth-token. The `Bearer` keyword is described in the original
    OAuth RFC and used in libraries like Angular-JWT.

    See #19094.

    *Peter Schröder*

216
*   Drop request class from RouteSet constructor.
217

218
    If you would like to use a custom request class, please subclass and implement
219 220 221 222
    the `request_class` method.

    *tenderlove@ruby-lang.org*

223 224 225 226 227 228 229 230 231 232
*   Fallback to `ENV['RAILS_RELATIVE_URL_ROOT']` in `url_for`.

    Fixed an issue where the `RAILS_RELATIVE_URL_ROOT` environment variable is not
    prepended to the path when `url_for` is called. If `SCRIPT_NAME` (used by Rack)
    is set, it takes precedence.

    Fixes #5122.

    *Yasyf Mohamedali*

G
Guo Xiang Tan 已提交
233 234 235 236 237
*   Partitioning of routes is now done when the routes are being drawn. This
    helps to decrease the time spent filtering the routes during the first request.

    *Guo Xiang Tan*

238 239 240 241 242 243 244
*   Fix regression in functional tests. Responses should have default headers
    assigned.

    See #18423.

    *Jeremy Kemper*, *Yves Senn*

245 246 247 248 249
*   Deprecate AbstractController#skip_action_callback in favor of individual skip_callback methods
    (which can be made to raise an error if no callback was removed).

    *Iain Beeston*

250
*   Alias the `ActionDispatch::Request#uuid` method to `ActionDispatch::Request#request_id`.
251 252 253 254 255
    Due to implementation, `config.log_tags = [:request_id]` also works in substitute
    for `config.log_tags = [:uuid]`.

    *David Ilizarov*

256 257 258 259 260 261 262 263
*   Change filter on /rails/info/routes to use an actual path regexp from rails
    and not approximate javascript version. Oniguruma supports much more
    extensive list of features than javascript regexp engine.

    Fixes #18402.

    *Ravil Bayramgalin*

264 265 266 267 268
*   Non-string authenticity tokens do not raise NoMethodError when decoding
    the masked token.

    *Ville Lautanala*

269 270
*   Add `http_cache_forever` to Action Controller, so we can cache a response
    that never gets expired.
271 272 273

    *arthurnn*

274
*   `ActionController#translate` supports symbols as shortcuts.
275 276
    When a shortcut is given it also performs the lookup without the action
    name.
277 278 279

    *Max Melentiev*

280 281 282 283 284 285
*   Expand `ActionController::ConditionalGet#fresh_when` and `stale?` to also
    accept a collection of records as the first argument, so that the
    following code can be written in a shorter form.

        # Before
        def index
286 287
          @articles = Article.all
          fresh_when(etag: @articles, last_modified: @articles.maximum(:updated_at))
288 289 290 291
        end

        # After
        def index
292
          @articles = Article.all
293 294 295 296 297
          fresh_when(@articles)
        end

    *claudiob*

298 299
*   Explicitly ignored wildcard verbs when searching for HEAD routes before fallback

300
    Fixes an issue where a mounted rack app at root would intercept the HEAD
301 302 303
    request causing an incorrect behavior during the fall back to GET requests.

    Example:
304 305 306 307 308 309 310 311

        draw do
            get '/home' => 'test#index'
            mount rack_app, at: '/'
        end
        head '/home'
        assert_response :success

312 313 314 315 316 317
    In this case, a HEAD request runs through the routes the first time and fails
    to match anything. Then, it runs through the list with the fallback and matches
    `get '/home'`. The original behavior would match the rack app in the first pass.

    *Terence Sun*

318 319 320 321 322 323 324 325 326 327 328 329 330
*   Migrating xhr methods to keyword arguments syntax
    in `ActionController::TestCase` and `ActionDispatch::Integration`

    Old syntax:

        xhr :get, :create, params: { id: 1 }

    New syntax example:

        get :create, params: { id: 1 }, xhr: true

    *Kir Shatrov*

R
Rafael Mendonça França 已提交
331
*   Migrating to keyword arguments syntax in `ActionController::TestCase` and
Y
Yves Senn 已提交
332
    `ActionDispatch::Integration` HTTP request methods.
333

Y
Yves Senn 已提交
334
    Example:
R
Rafael Mendonça França 已提交
335 336 337 338

        post :create, params: { y: x }, session: { a: 'b' }
        get :view, params: { id: 1 }
        get :view, params: { id: 1 }, format: :json
339 340 341

    *Kir Shatrov*

Y
Yves Senn 已提交
342
*   Preserve default url options when generating URLs.
343

344
    Fixes an issue that would cause `default_url_options` to be lost when
345 346 347 348 349
    generating URLs with fewer positional arguments than parameters in the
    route definition.

    *Tekin Suleyman*

350
*   Deprecate `*_via_redirect` integration test methods.
R
Rafael Mendonça França 已提交
351 352 353 354 355

    Use `follow_redirect!` manually after the request call for the same behavior.

    *Aditya Kapoor*

B
brainopia 已提交
356 357 358
*   Add `ActionController::Renderer` to render arbitrary templates
    outside controller actions.

B
brainopia 已提交
359 360 361
    Its functionality is accessible through class methods `render` and
    `renderer` of `ActionController::Base`.

B
brainopia 已提交
362 363
    *Ravil Bayramgalin*

364 365 366 367
*   Support `:assigns` option when rendering with controllers/mailers.

    *Ravil Bayramgalin*

368
*   Default headers, removed in controller actions, are no longer reapplied on
369 370 371 372
    the test response.

    *Jonas Baumann*

373
*   Deprecate all `*_filter` callbacks in favor of `*_action` callbacks.
374 375 376

    *Rafael Mendonça França*

377
*   Allow you to pass `prepend: false` to `protect_from_forgery` to have the
378 379
    verification callback appended instead of prepended to the chain.
    This allows you to let the verification step depend on prior callbacks.
Y
Yves Senn 已提交
380

381 382 383 384
    Example:

        class ApplicationController < ActionController::Base
          before_action :authenticate
385
          protect_from_forgery prepend: false, unless: -> { @authenticated_by.oauth? }
386 387 388 389 390 391 392 393 394 395 396 397 398 399 400

          private
            def authenticate
              if oauth_request?
                # authenticate with oauth
                @authenticated_by = 'oauth'.inquiry
              else
                # authenticate with cookies
                @authenticated_by = 'cookie'.inquiry
              end
            end
        end

    *Josef Šimánek*

401
*   Remove `ActionController::HideActions`.
402 403 404

    *Ravil Bayramgalin*

405 406 407 408 409
*   Remove `respond_to`/`respond_with` placeholder methods, this functionality
    has been extracted to the `responders` gem.

    *Carlos Antonio da Silva*

410 411 412 413
*   Remove deprecated assertion files.

    *Rafael Mendonça França*

414 415 416 417
*   Remove deprecated usage of string keys in URL helpers.

    *Rafael Mendonça França*

418 419 420 421
*   Remove deprecated `only_path` option on `*_path` helpers.

    *Rafael Mendonça França*

422 423 424 425
*   Remove deprecated `NamedRouteCollection#helpers`.

    *Rafael Mendonça França*

426 427 428 429
*   Remove deprecated support to define routes with `:to` option that doesn't contain `#`.

    *Rafael Mendonça França*

430 431 432 433
*   Remove deprecated `ActionDispatch::Response#to_ary`.

    *Rafael Mendonça França*

434 435 436 437
*   Remove deprecated `ActionDispatch::Request#deep_munge`.

    *Rafael Mendonça França*

438 439 440 441
*   Remove deprecated `ActionDispatch::Http::Parameters#symbolized_path_parameters`.

    *Rafael Mendonça França*

442 443 444 445
*   Remove deprecated option `use_route` in controller tests.

    *Rafael Mendonça França*

446 447
*   Ensure `append_info_to_payload` is called even if an exception is raised.

448
    Fixes an issue where when an exception is raised in the request the additional
449 450 451
    payload data is not available.

    See:
452
    * #14903
453 454 455 456
    * https://github.com/roidrage/lograge/issues/37

    *Dieter Komendera*, *Margus Pärt*

457 458 459 460
*   Correctly rely on the response's status code to handle calls to `head`.

    *Robin Dupret*

461 462 463 464 465 466 467 468 469 470 471 472
*   Using `head` method returns empty response_body instead
    of returning a single space " ".

    The old behavior was added as a workaround for a bug in an early
    version of Safari, where the HTTP headers are not returned correctly
    if the response body has a 0-length. This is been fixed since and
    the workaround is no longer necessary.

    Fixes #18253.

    *Prathamesh Sonpatki*

473 474 475 476
*   Fix how polymorphic routes works with objects that implement `to_model`.

    *Travis Grathwell*

Y
Yves Senn 已提交
477
*   Stop converting empty arrays in `params` to `nil`.
478

479
    This behavior was introduced in response to CVE-2012-2660, CVE-2012-2694
480 481 482 483 484 485 486 487
    and CVE-2013-0155

    ActiveRecord now issues a safe query when passing an empty array into
    a where clause, so there is no longer a need to defend against this type
    of input (any nils are still stripped from the array).

    *Chris Sinjakli*

Y
Yves Senn 已提交
488
*   Fixed usage of optional scopes in url helpers.
489 490 491

    *Alex Robbin*

Y
Yves Senn 已提交
492
*   Fixed handling of positional url helper arguments when `format: false`.
493 494 495 496 497

    Fixes #17819.

    *Andrew White*, *Tatiana Soukiassian*

498
Please check [4-2-stable](https://github.com/rails/rails/blob/4-2-stable/actionpack/CHANGELOG.md) for previous changes.