Vincent is Coding
March 23rd, 2024

Adding multiple optional query parameters

Ruby on Rails

One thing I wanted to achieve in Scribbles, and the Tinylytics integration is to dynamically create various query parameter options available with Tinylytics with ease.

Right now Scribbles only allows a few options to be set, but I wanted to be able to set other parameters as and when I get around adding them to the page.

When you have Tinylytics enabled on your site, the app will check for this and add the following snippet to the head of your site:

<% if @blog.tinylytics_site_id.present? %>
  <script src="https://tinylytics.app/embed/<%= @blog.tinylytics_site_id %>.js<%= @blog.tinylytics_options_query_string(current_user) %>" defer></script>
<% end %>

@blog is always available to the page as we're loading the specific blog in question, otherwise you'll get a generic 404 page.

You may notice the following:

<%= @blog.tinylytics_options_query_string(current_user) %>

This little method basically brings back a query string that we can use with all the options available with Tinylytics, for example showing Kudos.

A blog has various options, so I wanted an easy way to just create parameters on the fly, depending on the options, and just join them all together.

In addition to this, I pass in current_user — which basically either is you, if it's your blog, or is nil if there is no user logged in to Scribbles. With custom domains it will always be nil.

Here is method on my Blog model that creates the parameters I need:

def tinylytics_options_query_string(current_user = nil)
  params = []
  if !current_user.nil? && user_id == current_user.id
    params << "ignore"
  end
  params << "kudos=\#{self.tinylytics_kudos_symbol}" if self.tinylytics_show_kudos
  params << "hits" if self.tinylytics_show_lifetime_hits
  params << "webring" if self.tinylytics_show_webring
  params << "countries" if self.tinylytics_show_countries
  params << "uptime" if self.tinylytics_show_uptime
  query_string = params.empty? ? "" : "?\#{params.join('&')}"
end

You can see that it dynamically creates the available parameters depending on the blog settings you have set.

This is where I really love Ruby because it's super easy to follow and love the if in here.

Just an aside, I don't need to use self here, but I like it for context.

One additional tidbit on Scribbles is that I set a default kudos symbol, 👋, so I pass that in as a kudos parameter option:

params << "kudos=\#{self.tinylytics_kudos_symbol}" if self.tinylytics_show_kudos

Another little extra I do here, especially if you're accessing a blog via the Scribbles domain is also ignore your own hits using the special ignore parameter that I added to Tinylytics not too long ago.

if !current_user.nil? && user_id == current_user.id
  params << "ignore"
end

Each blog belongs to a user, so I check if the current_user that I passed in earlier isn't nil and if it belongs to the current user that requested the site.

Super simple but really helpful.