从Rake任务访问Sinatra应用程序范围

时间:2012-11-10 21:24:08

标签: ruby heroku sinatra rake-task

我在Sinatra应用程序中有一个全局变量,我想用我的Rakefile中的计划任务进行更新。请注意,该应用程序托管在Heroku上。我已经设置了帮助程序以访问此变量。

get '/' do
    @@var
end

helpers do
    def get_var
        return @@var
    end

    def set_var(value)
        @@var = value
    end
end

以下是我的Rakefile中的任务:

task :do_something do
    Sinatra::Application.set_var(get_data)
end

def get_data
    # Retrieve value from external source
    ...
    return val
end

我遇到的问题是任务正确执行,但Sinatra应用程序中的变量永远不会更新。我假设这是因为从Rakefile中调用Sinatra::Application实际上是从我想要更新的主实例创建一个单独的应用程序实例。

我想知道它们是否是一种从Rakefile任务中访问正在运行的Sinatra Web应用程序范围的方法。

*注意:我可以将计划任务中检索到的值写入数据库,然后从Sinatra应用程序访问它,但这样做会有些过分,因为这个变量不经常更新但是经常检索,我宁愿将其保存在内存中以便于访问。我已经调查了Memcache和Redis以避免转向数据库,但我再次认为这对于单个值来说是过分的。随意不同意这一点。

编辑:关于Alexey Sukhoviy的评论,Heroku不允许写入tmp目录之外的文件,并且这些文件不能保持足够长的时间以满足应用程序的需要。

1 个答案:

答案 0 :(得分:2)

我最终使用Memcache存储变量。 Heroku可以很好地使用它,因为它们为它提供了免费的附加功能。 Dalli gem为Ruby for Memcache提供了一个简单的接口。在我的Sinatra应用程序文件中,我设置了以下选项:

require 'dalli'

set :cache, Dalli::Client.new

然后我能够从Rakefile中恢复存储的变量:

task :do_something do
    Sinatra::Application.settings.cache.set('var', get_data)
end

然后我可以在我的Sinatra控制器中再次访问此变量:

settings.cache.get('var')