Ruby 从Rake任务访问Sinatra应用范围
我在Sinatra应用程序中有一个全局变量,我想用Rakefile中的计划任务更新该变量。请注意,应用程序托管在Heroku上。我已经设置了助手以访问此变量Ruby 从Rake任务访问Sinatra应用范围,ruby,heroku,sinatra,rake-task,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_so
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
task :do_something do
Sinatra::Application.settings.cache.set('var', get_data)
end
我遇到的问题是任务执行正确,但Sinatra应用程序中的变量从未更新。我假设这是因为从Rakefile中调用Sinatra::Application
实际上会从我尝试更新的主实例创建一个单独的应用程序实例
我想知道它们是否是从Rakefile任务中访问正在运行的Sinatra web应用程序范围的一种方法
*注意:我可以将在计划任务中检索到的值写入数据库,然后从Sinatra应用程序访问它,但这太过分了,因为该变量更新得太少,但检索得太频繁,因此我更愿意将其保存在内存中以便于访问。为了避免转向数据库,我研究了Memcache和Redis,但我再次感到,对于单个值来说,这将是过度的。请随意不同意这一点
编辑:关于Alexey Sukhoviy的评论,Heroku不允许写入tmp目录以外的文件,并且这些文件的保存时间不足以满足应用程序的需要。我最终使用Memcache存储变量。这对Heroku很好,因为他们提供了一个免费的附加组件。提供了与Ruby for Memcache的简单接口。在我的Sinatra应用程序文件中,我设置了以下选项:
require 'dalli'
set :cache, Dalli::Client.new
然后,我可以从Rakefile恢复存储的变量:
task :do_something do
Sinatra::Application.set_var(get_data)
end
def get_data
# Retrieve value from external source
...
return val
end
task :do_something do
Sinatra::Application.settings.cache.set('var', get_data)
end
然后,我可以在我的Sinatra控制器中再次访问此变量:
settings.cache.get('var')
我建议您这样的解决方案:通过rake任务将这个变量的值保存到某个文件中。然后在你的Sinatra应用程序上从这个文件中读取这个变量。我很感谢你的尝试,但在我发现部署到Heroku时出现问题之前,这实际上是我在我的开发环境中所做的。有关更多详细信息,请参见我的问题编辑。