I have a non-hanami app which uses hanami-controller and router. I’m in the process if upgrading it to use ruby 3, which means I need to update hanami-router from 1.3.2 to one of the 2.0.0 beta versions.
In hanami-router 1.3.2, you could specify a ruby namespace where the router would look for your actions. I don’t see this behavior anymore. Does that mean I have to manually specify every route now?
This functionality changed a bit in 2.0 but you can still achieve the same result. It’s encapsulated in a route resolver object than can be passed into Hanami::Router
:
# Resolve a route identity to an Action instance.
# Infers the `actions` prefix for container keys to reduce duplication.
class RouteResolver
include Dry::Initializer.define -> do
param :container
end
def call(_, ident)
case ident
when String, Symbol
String(ident)
.then { |str| str.start_with?("actions") ? str : "actions.#{str}" }
.then { |str| container.resolve(str) }
when Class
ident.respond_to?(:call) ? ident : ident.new
else
ident
end
end
end
Hanami::Router.new(resolver: RouteResolver.new(Application))
1 Like