Ruby变量范围:从现有的ruby类中访问rack.env?

时间:2013-07-05 19:57:15

标签: ruby sinatra scope rack env

我有一个简单的课程:

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

在整个应用程序中都会这样调用:

 thing = Repository.find("abc")

我们在Sinatra / rack环境中。在请求阶段,我们会这样做:

  env['org'] = 'acme'

我想要做的是能够从类'acme'内部访问Repository,而不必明确地传入它。这个类的调用次数太多了每次通过find方法传递值时会很痛苦的地方,例如find(id,org = nil)。我想也许有一种方法可以将机架宝石包含在Repository中,并以此方式实现,但到目前为止还没有运气。全局变量已经结束 - 必须确定请求的范围。

是否可以做这样的事情?

1 个答案:

答案 0 :(得分:0)

就我个人而言,我认为在类方法中有一个像变量那样变化的变量会遇到麻烦,它会通过跨越边界来打破Law of Demeter。相反,我将它包装在Sinatra助手中,然后默认传递第二个参数。

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

并修改Repository的{​​{1}}方法以获取第二个参数。