ruby-on-railsrubyruby-on-rails-3activeresource

Add api key to every request in ActiveResource


I have 2 RESTful Rails apps I'm trying to make talk to each other. Both are written in Rails 3 (beta3 at the moment). The requests to the service will require the use an api key which is just a param that needs to be on every request. I can't seem to find any information on how to do this.

You define the url the resource connects to via the site= method. There should be an equivalent query_params= method or similar.

There is one good blog post I found related to this and it's from October 2008, so not exactly useful for Rails 3.

Update: I had a thought. Would a small Rack middleware or Metal be the answer to this? It could just pass through the request, tacking it's api_key on.


Solution

  • Use model#prefix_options which is a hash for passing params into query string (or even as substitions for parts of the Model.prefix, e.g. "/myresource/:param/" will be replaced by the value of prefix_options[:param] . Any hash keys not found in the prefix will be added to the query string, which is what we want in your case).

    class Model < ActiveResource::Base
      class << self
        attr_accessor :api_key
      end
    
      def save
        prefix_options[:api_key] = self.class.api_key
        super
      end
    end
    
    Model.site = 'http://yoursite/'
    Model.api_key = 'xyz123'
    m = Model.new(:field_1 => 'value 1')
    # hits http://yoursite:80/models.xml?api_key=xyz123
    m.save