Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things

Re^2: Mojolicious absolute url with query in template?

by Anonymous Monk
on Mar 19, 2020 at 09:22 UTC ( #11114460=note: print w/replies, xml ) Need Help??

in reply to Re: Mojolicious absolute url with query in template?
in thread Mojolicious absolute url with query in template?

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?

Replies are listed 'Best First'.
Re^3: Mojolicious absolute url with query in template?
by Corion (Patriarch) on Mar 19, 2020 at 09:25 UTC

    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.

Re^3: Mojolicious absolute url with query in template? (updated)
by haukex (Bishop) on Mar 19, 2020 at 09:35 UTC

    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:
      Your answer (of course) returns the absolute request url with query string:
      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.

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11114460]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (9)
As of 2022-05-23 08:23 GMT
Find Nodes?
    Voting Booth?
    Do you prefer to work remotely?

    Results (81 votes). Check out past polls.