Rails Metal Example #7: Tracking Analytics

by Charles Max Wood on August 10, 2009

Last month, I posted 9 Ways to Use Rails Metal. This is the seventh way to use Rails Metal.

A week ago, I posted Ruby on Rails: Polymorphic Associations with Mixin Modules which included an example of tracking impressions on different objects.


For this Rails Metal example, we’ll use that mixin to track page impressions.

class Page < ActiveRecord::Base
  include ImpressionableMixin
end

Now that we have the impressions association set up, let’s get on with the Metal.

# Allow the metal piece to run in isolation
require(File.dirname(__FILE__) + "/../../config/environment") unless defined?(Rails)

class Pages
  def self.call(env)
    page = Page.find_or_create_by_path(env["PATH_INFO"])
    session = env['rack.session']
    visitor = Visitor.find_by_id(session["visitor_id"])
    page.add_impression(visitor)
    [404, {"Content-Type" => "text/html"}, ["Not Found"]]
  end
end

As you can see in this case, we aren’t actually returning a response here. We’re saving the impression and the passing the request up the chain. The example is pretty simple, but it demonstrates that Rails Metal doesn’t need to provide an end point your request.

Previous post:

Next post: