in reply to Mojolicious absolute url with query in template?

This works but seems wrong: <%= url_for('/')->to_abs %>?<%= url_with->query %> Is there a better way?

Absolutely!

<%= url_for('/')->to_abs->query(foo=>"bar") %>

Replies are listed 'Best First'.
Re^2: Mojolicious absolute url with query in template?
by Anonymous Monk on Mar 19, 2020 at 09:22 UTC
    Thanks for replying. I tried adding ->query before asking the question, because it seemed logical, but it didn't work as expected. This displays the url without the query string:
    <%= url_for('/')->to_abs %>
    But this displays absolutely nothing:
    <%= url_for('/')->to_abs->query %>
    Here's the weird part, a link made with "to_abs->query" works, but can't be right clicked ("Void" link with click handler) and when source is viewed the href appears to be blank:
    <a href="<%= url_for('/')->to_abs->query %>"> Reload </a>
    What is this voodoo?

      You don't give any argument to ->query(), so the query part is empty. If you want query parameters, you have to give them to the method, like haukex already demonstrated.

      <a href="<%= url_for('/')->to_abs->query( foo => 'bar' )%>"> Reload </ +a>

      If you want to keep the current query parameters, you need to pass those into your template.

      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>

        Thank you haukex! I tried url_with too but was doing something stupid that only returned the query string:
        url_with('/')->to_abs->query
        Your answer (of course) returns the absolute request url with query string:
        url_with('/')->to_abs
        Also those link_to helpers are super cool. Now I see what Corion meant by passing params to the query method and why I'd want to do that.