【问题标题】:Redis not working in sinatra rake tasksRedis 在 sinatra rake 任务中不工作
【发布时间】:2015-10-30 03:42:25
【问题描述】:

我想在我的 Sinatra 应用中使用 Redis。虽然我可以在本地和远程(heroku)的控制台中访问 Redis 实例,但当我想在 rake 任务中使用它时,会触发错误,我似乎不明白为什么会这样。

app.rb:

class MyApp < Sinatra::Base
  configure do
    uri = URI.parse(ENV["REDISCLOUD_URL"])
    $redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
  end
end

config.ru:

require 'rubygems'
require 'sinatra'
require './app'
run MyApp

宝石文件

gem 'redis'

Rakefile.rb

desc 'Try Redis'
  task :try_redis do
  puts $redis.set("try", 0)
end

rake 中止! NoMethodError: nil:NilClass 的未定义方法“set”

我不太习惯 Sinatra,我觉得没有什么特别不对劲的地方。我不明白为什么我的全局变量 $redis 无法从我的应用程序的任何地方访问...

如果您能赐教,在此先感谢您!

【问题讨论】:

    标签: ruby redis gem sinatra rake


    【解决方案1】:

    我不明白为什么我的全局变量 $redis 不会 从我的应用程序的任何地方都可以访问

    您的rake 任务与您的应用无关。 $redis 变量仅在您运行 sinatra 服务器时可用,而在您运行 rake 任务时不可用。 rake 任务在自己的线程中运行。

    【讨论】:

    • 谢谢,我还是有点困惑(“你的 rake 任务与你的应用程序无关。”),但我只需要将与 Redis 的连接移到 rake 任务中即可工作正常。您的回答帮助我前进,非常感谢!
    • 您的 rake 任务与您的应用无关。 我的意思是在代码级别,您的服务器和 rake 任务未连接,这是一个不同的线程。
    • 打开两个irb会话,将$foo = 1分配在一个,在另一个尝试puts $foo
    • 我明白了。它们是 2 个不同的线程,它们都应该连接到同一个 redis 数据库才能获取数据。这说得通。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-06-21
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    相关资源
    最近更新 更多