Доступ к области приложения Sinatra из задачи Rake

У меня есть глобальная переменная в приложении 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 никогда не обновляется. Я предполагаю, что это связано с тем, что вызов Sinatra::Application из Rakefile фактически создает отдельный экземпляр приложения из основного экземпляра, который я пытаюсь обновить.

Я хочу знать, является ли это способом доступа к области действия работающего веб-приложения Sinatra из задачи Rakefile.

*Примечание. Я мог бы просто записать значение, полученное в запланированной задаче, в базу данных, а затем получить к нему доступ из приложения Sinatra, но это было бы излишним, потому что эта переменная обновляется так редко, но извлекается так регулярно, что я бы предпочел сохранить ее в памяти для более легкого доступа. Я изучил Memcache и Redis, чтобы не обращаться к базе данных, но опять же я чувствую, что это было бы чрезмерным для одного значения. Смело не соглашайтесь с этим.

РЕДАКТИРОВАТЬ: Что касается комментария Алексея Сухового, Heroku не позволяет записывать файлы за пределами каталогов tmp, и они не сохраняются достаточно долго, чтобы удовлетворить потребности приложения.


person CalMlynarczyk    schedule 10.11.2012    source источник
comment
Я предлагаю вам такое решение: Сохраните значение этой переменной в какой-либо файл с помощью задачи rake. А затем прочитайте эту переменную из этого файла в вашем приложении Sinatra.   -  person suhovius    schedule 11.11.2012
comment
Я ценю эту попытку, но на самом деле это было то, что я делал в своей среде разработки, прежде чем обнаружил, что проблемы возникают при развертывании в Heroku. Смотрите мои изменения вопроса для более подробной информации.   -  person CalMlynarczyk    schedule 13.11.2012


Ответы (1)


В итоге я сохранил переменную с помощью Memcache. Это хорошо работает с Heroku, поскольку они предоставляют для него бесплатное дополнение. гем Dalli предоставляет простой интерфейс с Ruby для 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')
person CalMlynarczyk    schedule 12.11.2012