Skip to content

Commit

Permalink
Allow declaring controller callbacks for certain routes
Browse files Browse the repository at this point in the history
This makes it more convenient to execute callbacks only for certain
routes, by allowing usage of `:only` and `:except` keyword arguments.

This should play nicely with the recent instrumentation change, as the
user will see route names in the logs.
  • Loading branch information
janko committed Apr 8, 2024
1 parent 4a4af03 commit 57e2a84
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 8 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ end
```
```rb
class RodauthController < ApplicationController
before_action :set_locale # executes before Rodauth endpoints
before_action :verify_captcha, only: :login, if: -> { request.post? } # executes before Rodauth endpoints
rescue_from("MyApp::SomeError") { |exception| ... } # rescues around Rodauth endpoints
end
```
Expand Down
2 changes: 2 additions & 0 deletions lib/rodauth/rails/feature/callbacks.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ module Callbacks
private

def _around_rodauth
rails_controller_instance.instance_variable_set(:@_action_name, current_route.to_s)

rails_controller_around { super }
end

Expand Down
22 changes: 15 additions & 7 deletions test/integration/callbacks_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
5 changes: 5 additions & 0 deletions test/rails_app/app/controllers/rodauth_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down

0 comments on commit 57e2a84

Please sign in to comment.