Working with the ruby-freshbooks gem

ruby-freshbooks maps API calls in a somewhat object-oriented fashion. You can call #create, #update, #list, etc on a good number of API entities (like time_entry, client and staff). Check the FreshBooks API docs for a full list of available methods. Generally, the methods are called like the following:

The gist of this is to define a caching mechanism so we're not slamming the FreshBooks API. If we fetch an entity by the entity's ID, cache the result for that ID. Let's break this chunk of code down once we're inside the loop:

cache_var = instance_variable_set("@#{entity_name}_cache", {})

This does what you would expect: it defines an instance variable. @cachable_entities contains two entities we want to cache, staff and task. So in the end we have two class instance variables which act as in-memory cache: @staff_cache = {} and @task_cache = {}.

#get_staff and #get_task are called within our #get_rate method (but could be used elsewhere). #get_rate returns the rate which should be used for a given time entry. Rates can be project-based, staff-based or task-based. We need to find the appropriate rate based on the project['bill_method'].

Modify this code to your needs, restart your Rack server, visit http://localhost:9292/ and you should see all your projects, the total time spent on each and the total income from each.

If you've made it this far, give yourself a pat on the rear because this part in the series is definitely the hardest. Let me know if you have any issues understanding the FBOnRack class above. In Part Three of this series, we'll finish off by deploying to Heroku and baking a cake.