Custom URL helpers in Rails
Ever want a named route for something that's not necessarily a resource in your Rails app?
In your any of your route files you can utilize direct
.
# config/routes.rb
Rails.application.routes.draw do
get 'foo', to: 'foo#bar'
direct :get_to_the_goog do
"https://google.com"
end
end
This gives a nice named route of get_to_the_goog_url
!
This can be even more useful as the return value of the block has to be valid arguments that you would pass to url_for
. So you can use pretty much anything you'd normally use to build a url helper.
Let's modify this just a bit to be more useful.
# config/routes.rb
Rails.application.routes.draw do
get 'foo', to: 'foo#bar'
direct :get_to_the_goog, search: nil do |options|
"https://google.com/search?q=#{options[:search]}"
end
end
Now we can call get_to_the_goog_url(search: "TIL")
.
Pretty cool... just take note of a few caveats. You get access to the _path
version of the named helper but even if the helper is using a hard coded string (like our example above), it will remove the domain info (rightfully so). Also you are not able to use the direct
functionality inside of a namespace
or scope
, however it will raise an error if you do... so that's nice.