2012-11-10 72 views
0

我想用我的Rakefile中的計劃任務更新Sinatra應用程序中的全局變量。請注意,該應用程序託管在Heroku上。爲了訪問這個變量,我設置了助手。從Rake任務訪問Sinatra應用程序範圍

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 

我遇到的問題是,任務執行正常,但在西納特拉應用變量永遠不會更新。我認爲這是因爲從Rakefile中調用Sinatra::Application實際上是從我嘗試更新的主實例創建一個單獨的應用程序實例。

我想知道他們是否是一種從Rakefile任務中訪問正在運行的Sinatra Web應用程序範圍的方法。注意:我可以將計劃任務中檢索到的值寫入數據庫,然後從Sinatra應用程序訪問它,但這樣做會過度殺傷,因爲此變量更新頻率很低,但經常檢索,所以我更喜歡將其保存在內存中以便於訪問。我已經研究過Memcache和Redis以避免轉向數據庫,但我認爲這對於單個值來說會過度。隨意不同意這一點。

編輯:關於Alexey Sukhoviy的評論,Heroku不允許寫入tmp目錄之外的文件,並且這些文件不會長時間存活以滿足應用程序的需求。

+0

我建議你這樣的解決方案:通過rake任務將該變量的值保存到某個文件中。而不是從你的Sinatra應用程序的這個文件中讀取這個變量。 – suhovius

+0

我很欣賞這種嘗試,但實際上這是我在開發環境中所做的工作,然後才發現在部署到Heroku時出現問題。查看我的問題編輯瞭解更多詳情。 – CalMlynarczyk

回答

1

我結束了使用Memcache存儲變量。這與Heroku一起玩的很好,因爲它們爲它提供了免費的附加組件。 Dalli gem爲Ruby for Memcache提供了一個簡單的界面。在我屈的應用程序文件,我設置以下選項:

require 'dalli' 

set :cache, Dalli::Client.new 

我然後我能夠恢復從Rake文件存儲的變量:

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

然後我可以在我的末日控制器再次訪問這個變量:

settings.cache.get('var')