【问题标题】:Ruby variable scope: access rack.env from inside an existing ruby class?Ruby 变量范围:从现有的 ruby​​ 类中访问 rack.env?
【发布时间】:2013-07-05 19:57:14
【问题描述】:

我有一个简单的课程:

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

在我们的整个应用程序中都是这样调用的:

 thing = Repository.find("abc")

我们处于 Sinatra/机架环境中。在请求阶段,我们会这样做:

  env['org'] = 'acme'

我想做的是能够从Repository 类内部访问'acme',而无需显式传递它。到处都有对这个类的调用,以至于它每次通过 find 方法传递值会很痛苦,例如find(id,org = nil)。我想也许有一种方法可以将 rack gem 包含在 Repository 中,并以这种方式进行操作,但到目前为止还没有运气。全局变量已失效 - 必须限定在请求范围内。

有可能做这样的事情吗?

【问题讨论】:

    标签: ruby sinatra scope rack env


    【解决方案1】:

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

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

    并修改Repositoryfind 方法以采用第二个参数。

    【讨论】:

    • 是的,我几乎最终做到了。这是大量的重构,但我同意我试图作为捷径做的事情完全是一团糟。
    猜你喜欢
    • 2018-04-08
    • 2011-10-20
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 2017-02-13
    • 2018-06-28
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多