From 3a77202816766a76644b505701c107a2be286cc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janko=20Marohni=C4=87?= Date: Sun, 26 Nov 2023 09:50:48 +0100 Subject: [PATCH] Enable per-action controller callbacks --- lib/rodauth/rails/feature/callbacks.rb | 2 ++ test/integration/callbacks_test.rb | 22 +++++++++++++------ .../app/controllers/rodauth_controller.rb | 5 +++++ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/lib/rodauth/rails/feature/callbacks.rb b/lib/rodauth/rails/feature/callbacks.rb index fb0f2cd6..25c714d6 100644 --- a/lib/rodauth/rails/feature/callbacks.rb +++ b/lib/rodauth/rails/feature/callbacks.rb @@ -12,6 +12,8 @@ def _around_rodauth # Runs controller callbacks and rescue handlers around Rodauth actions. def rails_controller_around + rails_controller_instance.instance_variable_set(:@_action_name, rails_path_parameters[:action]) + result = nil rails_controller_rescue do diff --git a/test/integration/callbacks_test.rb b/test/integration/callbacks_test.rb index a84ffbb5..6d083cf3 100644 --- a/test/integration/callbacks_test.rb +++ b/test/integration/callbacks_test.rb @@ -5,18 +5,26 @@ class CallbacksTest < IntegrationTest visit "/login" assert_match "login-form", page.html - assert_equal 200, page.status_code - assert_equal "true", page.response_headers["X-Before-Action"] - assert_equal "true", page.response_headers["X-After-Action"] - assert_equal "true", page.response_headers["X-Before-Around-Action"] - assert_equal "true", page.response_headers["X-After-Around-Action"] + assert_equal 200, page.status_code + assert_equal "true", page.response_headers["X-Before-Action"] + assert_equal "true", page.response_headers["X-After-Action"] + assert_equal "true", page.response_headers["X-Before-Around-Action"] + assert_equal "true", page.response_headers["X-After-Around-Action"] + end + + test "runs callbacks for specific actions" do + visit "/create-account" + assert_equal "true", page.response_headers["X-Before-Specific-Action"] + + visit "/login" + assert_nil page.response_headers["X-Before-Specific-Action"] end test "handles rendering in callback chain" do visit "/login?early_return=true&fail=true" assert_equal "early return", page.html - assert_equal 201, page.status_code - assert_equal "true", page.response_headers["X-Before-Action"] + assert_equal 201, page.status_code + assert_equal "true", page.response_headers["X-Before-Action"] end end diff --git a/test/rails_app/app/controllers/rodauth_controller.rb b/test/rails_app/app/controllers/rodauth_controller.rb index 86546a2f..0f72f20f 100644 --- a/test/rails_app/app/controllers/rodauth_controller.rb +++ b/test/rails_app/app/controllers/rodauth_controller.rb @@ -2,6 +2,7 @@ class RodauthController < ApplicationController before_action :before_route after_action :after_route around_action :around_route + before_action :before_specific_route, only: [:create_account] rescue_from NotImplementedError do render plain: "rescued response", status: 500 @@ -27,6 +28,10 @@ def around_route response.headers["X-After-Around-Action"] = "true" end + def before_specific_route + response.header["X-Before-Specific-Action"] = "true" + end + def some_method "controller method" end