Question

I have a simple class:

class Repository
  class << self
    def find(id)
      ...
    end
  end
end

It is called like this throughout our app:

 thing = Repository.find("abc")

We are in a Sinatra/rack environment. During the request phase we do something like this:

  env['org'] = 'acme'

What I'd like to do is be able to get access to 'acme' from inside the class Repository, without having to explicitly pass it in. There are so many calls to this class all over the place that it would be a pain to pass in the value each time through the find method e.g., find(id,org = nil). I thought maybe there's a way to include the rack gem in Repository, and get at it that way, but so far no luck. Global variables are out - has to be scoped to the request.

Is it possible to do something like this?

Was it helpful?

Solution

Personally, I think having a variable that changes like that inside a class method is asking for trouble, it breaks the Law of Demeter by reaching across boundaries. Instead, I'd wrap it in a Sinatra helper which then passes the second argument by default.

helpers do
  def find( s )
    Repository.find( s, env['org'] )
  end
end

and modify the Repository's find method to take the second argument.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top