Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 从Rake任务访问Sinatra应用范围_Ruby_Heroku_Sinatra_Rake Task - Fatal编程技术网

Ruby 从Rake任务访问Sinatra应用范围

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

我在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
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时出现问题之前,这实际上是我在我的开发环境中所做的。有关更多详细信息,请参见我的问题编辑。