mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
45f1c7a3e1
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.
60 lines
1.3 KiB
Ruby
60 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "abstract_unit"
|
|
|
|
class ActionableExceptionsTest < ActionDispatch::IntegrationTest
|
|
Actions = []
|
|
|
|
class ActionError < StandardError
|
|
include ActiveSupport::ActionableError
|
|
|
|
action "Successful action" do
|
|
Actions << "Action!"
|
|
end
|
|
|
|
action "Failed action" do
|
|
raise "Inaction!"
|
|
end
|
|
end
|
|
|
|
Noop = -> env { [200, {}, [""]] }
|
|
|
|
setup do
|
|
@app = ActionDispatch::ActionableExceptions.new(Noop)
|
|
|
|
Actions.clear
|
|
end
|
|
|
|
test "dispatches an actionable error" do
|
|
post ActionDispatch::ActionableExceptions.endpoint, params: {
|
|
error: ActionError.name,
|
|
action: "Successful action",
|
|
location: "/",
|
|
}
|
|
|
|
assert_equal ["Action!"], Actions
|
|
|
|
assert_equal 302, response.status
|
|
assert_equal "/", response.headers["Location"]
|
|
end
|
|
|
|
test "dispatched action can fail" do
|
|
assert_raise RuntimeError do
|
|
post ActionDispatch::ActionableExceptions.endpoint, params: {
|
|
error: ActionError.name,
|
|
action: "Failed action",
|
|
location: "/",
|
|
}
|
|
end
|
|
end
|
|
|
|
test "cannot dispatch non-actionable errors" do
|
|
assert_raise ActiveSupport::ActionableError::NonActionable do
|
|
post ActionDispatch::ActionableExceptions.endpoint, params: {
|
|
error: RuntimeError.name,
|
|
action: "Inexistent action",
|
|
location: "/",
|
|
}
|
|
end
|
|
end
|
|
end
|