Actionable errors let's you dispatch actions from Rails' error pages. This can help you save time if you have a clear action for the resolution of common development errors. The de-facto example are pending migrations. Every time pending migrations are found, a middleware raises an error. With actionable errors, you can run the migrations right from the error page. Other examples include Rails plugins that need to run a rake task to setup themselves. They can now raise actionable errors to run the setup straight from the error pages. Here is how to define an actionable error: ```ruby class PendingMigrationError < MigrationError #:nodoc: include ActiveSupport::ActionableError action "Run pending migrations" do ActiveRecord::Tasks::DatabaseTasks.migrate end end ``` To make an error actionable, include the `ActiveSupport::ActionableError` module and invoke the `action` class macro to define the action. An action needs a name and a procedure to execute. The name is shown as the name of a button on the error pages. Once clicked, it will invoke the given procedure.
7.3 KiB
-
Introduce
ActionDispatch::ActionableExceptions
.The
ActionDispatch::ActionableExceptions
middleware dispatches actions fromActiveSupport::ActionableError
descendants.Actionable errors let's you dispatch actions from Rails' error pages.
Vipul A M, Yao Jie, Genadi Samokovarov
-
Raise an
ArgumentError
if a resource custom param contains a colon (:
).After this change it's not possible anymore to configure routes like this:
routes.draw do resources :users, param: 'name/:sneaky' end
Fixes #30467.
Josua Schmid
Rails 6.0.0.beta3 (March 11, 2019)
- No changes.
Rails 6.0.0.beta2 (February 25, 2019)
-
Make debug exceptions works in an environment where ActiveStorage is not loaded.
Tomoyuki Kurosawa
-
ActionDispatch::SystemTestCase.driven_by
can now be called with a block to define specific browser capabilities.Edouard Chin
Rails 6.0.0.beta1 (January 18, 2019)
-
Remove deprecated
fragment_cache_key
helper in favor ofcombined_fragment_cache_key
.Rafael Mendonça França
-
Remove deprecated methods in
ActionDispatch::TestResponse
.#success?
,missing?
anderror?
were deprecated in Rails 5.2 in favor of#successful?
,not_found?
andserver_error?
.Rafael Mendonça França
-
Introduce
ActionDispatch::HostAuthorization
.This is a new middleware that guards against DNS rebinding attacks by explicitly permitting the hosts a request can be made to.
Each host is checked with the case operator (
#===
) to supportRegExp
,Proc
,IPAddr
and custom objects as host allowances.Genadi Samokovarov
-
Allow using
parsed_body
inActionController::TestCase
.In addition to
ActionDispatch::IntegrationTest
, allow usingparsed_body
inActionController::TestCase
:class SomeControllerTest < ActionController::TestCase def test_some_action post :action, body: { foo: 'bar' } assert_equal({ "foo" => "bar" }, response.parsed_body) end end
Fixes #34676.
Tobias Bühlmann
-
Raise an error on root route naming conflicts.
Raises an
ArgumentError
when multiple root routes are defined in the same context instead of assigning nil names to subsequent roots.Gannon McGibbon
-
Allow rescue from parameter parse errors:
rescue_from ActionDispatch::Http::Parameters::ParseError do head :unauthorized end
Gannon McGibbon, Josh Cheek
-
Reset Capybara sessions if failed system test screenshot raising an exception.
Reset Capybara sessions if
take_failed_screenshot
raise exception in system testafter_teardown
.Maxim Perepelitsa
-
Use request object for context if there's no controller
There is no controller instance when using a redirect route or a mounted rack application so pass the request object as the context when resolving dynamic CSP sources in this scenario.
Fixes #34200.
Andrew White
-
Apply mapping to symbols returned from dynamic CSP sources
Previously if a dynamic source returned a symbol such as :self it would be converted to a string implicitly, e.g:
policy.default_src -> { :self }
would generate the header:
Content-Security-Policy: default-src self
and now it generates:
Content-Security-Policy: default-src 'self'
Andrew White
-
Add
ActionController::Parameters#each_value
.Lukáš Zapletal
-
Deprecate
ActionDispatch::Http::ParameterFilter
in favor ofActiveSupport::ParameterFilter
.Yoshiyuki Kinjo
-
Encode Content-Disposition filenames on
send_data
andsend_file
. Previously,send_data 'data', filename: "\u{3042}.txt"
sends"filename=\"\u{3042}.txt\""
as Content-Disposition and it can be garbled. Now it follows RFC 2231 and RFC 5987 and sends"filename=\"%3F.txt\"; filename*=UTF-8''%E3%81%82.txt"
. Most browsers can find filename correctly and old browsers fallback to ASCII converted name.Fumiaki Matsushima
-
Expose
ActionController::Parameters#each_key
which allows iterating over keys without allocating an array.Richard Schneeman
-
Purpose metadata for signed/encrypted cookies.
Rails can now thwart attacks that attempt to copy signed/encrypted value of a cookie and use it as the value of another cookie.
It does so by stashing the cookie-name in the purpose field which is then signed/encrypted along with the cookie value. Then, on a server-side read, we verify the cookie-names and discard any attacked cookies.
Enable
action_dispatch.use_cookies_with_metadata
to use this feature, which writes cookies with the new purpose and expiry metadata embedded.Assain Jaleel
-
Raises
ActionController::RespondToMismatchError
with conflictingrespond_to
invocations.respond_to
can match multiple types and lead to undefined behavior when multiple invocations are made and the types do not match:respond_to do |outer_type| outer_type.js do respond_to do |inner_type| inner_type.html { render body: "HTML" } end end end
Patrick Toomey
-
ActionDispatch::Http::UploadedFile
now delegatesto_path
to its tempfile.This allows uploaded file objects to be passed directly to
File.read
without raising aTypeError
:uploaded_file = ActionDispatch::Http::UploadedFile.new(tempfile: tmp_file) File.read(uploaded_file)
Aaron Kromer
-
Pass along arguments to underlying
get
method infollow_redirect!
Now all arguments passed to
follow_redirect!
are passed to the underlyingget
method. This for example allows to set custom headers for the redirection request to the server.follow_redirect!(params: { foo: :bar })
Remo Fritzsche
-
Introduce a new error page to when the implicit render page is accessed in the browser.
Now instead of showing an error page that with exception and backtraces we now show only one informative page.
Vinicius Stock
-
Introduce
ActionDispatch::DebugExceptions.register_interceptor
.Exception aware plugin authors can use the newly introduced
.register_interceptor
method to get the processed exception, instead of monkey patching DebugExceptions.ActionDispatch::DebugExceptions.register_interceptor do |request, exception| HypoteticalPlugin.capture_exception(request, exception) end
Genadi Samokovarov
-
Output only one Content-Security-Policy nonce header value per request.
Fixes #32597.
Andrey Novikov, Andrew White
-
Move default headers configuration into their own module that can be included in controllers.
Kevin Deisz
-
Add method
dig
tosession
.claudiob, Takumi Shotoku
-
Controller level
force_ssl
has been deprecated in favor ofconfig.force_ssl
.Derek Prior
-
Rails 6 requires Ruby 2.5.0 or newer.
Jeremy Daer, Kasper Timm Hansen
Please check 5-2-stable for previous changes.