Oh, I think I see what you're getting at. Note the documentation for url_with:
Does the same as "url_for", but inherits query parameters from the current request.
<update> Expanded url_for vs. url_with examples. </update>
#!/usr/bin/env perl
use Mojolicious::Lite -signatures;
get '/' => sub ($c) {
if ( !$c->param('foo') )
{ $c->redirect_to( $c->url_for('index')->query(foo=>"bar") ) }
else { $c->render('index') }
} => 'index';
app->start;
__DATA__
@@ index.html.ep
% layout 'main', title => 'Hello, World!';
<pre>
%= url_for('/')
%= url_for('/')->to_abs
%= url_for('/')->to_abs->query(abc=>"xyz")
%= url_with('/')
%= url_with('/')->to_abs
%= url_with('/')->to_abs->query(abc=>"xyz")
</pre>
@@ layouts/main.html.ep
<!DOCTYPE html>
<html>
<head><title><%= title %></title></head>
<body><main>
<%= content %>
</main></body>
</html>
Visiting http://localhost:3000/ results in a single redirect (to add the query for demonstration purposes), and then renders as:
/
http://localhost:3000/
http://localhost:3000/?abc=xyz
/?foo=bar
http://localhost:3000/?foo=bar
http://localhost:3000/?abc=xyz
Also, note the link_to helper: %= link_to Reload => url_with('/')->to_abs results in <a href="http://localhost:3000/?foo=bar">Reload</a> |