From 45f1c7a3e16437e517baa6606674f7bbb16dba74 Mon Sep 17 00:00:00 2001 From: Genadi Samokovarov Date: Tue, 25 Dec 2018 16:35:15 +0200 Subject: Introduce Actionable Errors 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. --- .../middleware/templates/rescues/_actions.html.erb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 actionpack/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb (limited to 'actionpack/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb') diff --git a/actionpack/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb b/actionpack/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb new file mode 100644 index 0000000000..e181b6c539 --- /dev/null +++ b/actionpack/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb @@ -0,0 +1,15 @@ +<% if ActiveSupport::ActionableError === exception %> + <% actions = ActiveSupport::ActionableError.actions(exception) %> + + <% if actions.any? %> +
+ <% actions.each do |action, _| %> + <%= button_to action, ActionDispatch::ActionableExceptions.endpoint, params: { + error: exception.class.name, + action: action, + location: request.path + } %> + <% end %> +
+ <% end %> +<% end %> -- cgit v1.2.3