NoMethodError - nil:NilClass 的未定义方法“get”

NoMethodError - undefined method `get' for nil:NilClass

这里是我遵循的实现教程:Finally Trying ActionCable

这段代码太长了,所以我没有把这段代码放在这个问题中我只是把一些代码放在用户模型中

def online_now?
    $redis.get("users:online:#{id}").present?
end

视图是:

<% User.all.each do |user| %>
    <%= user.name %>
    <div class="online-indicator">
        <% if !user.online_now? && 'xs-none' %>
            Online
        <% else %>
            Offline
        <% end %>
    </div>
<% end %>

但总是报错

NoMethodError - undefined method get' for nil:NilClass Did you mean? gem: app/models/user.rb:34:inonline_now?'

表示这一行

$redis.get("users:online:#{id}").present?

我不明白为什么会抛出这个错误。

但它在 rails 控制台上工作

irb(main):005:0> redis.set("mykey", "hello world")
=> "OK"
irb(main):006:0> redis.get("mykey")
=> "hello world"

谢谢

来自评论 @Ilya Konyukhov 您如何在模型方法中定义 $redis 变量。很明显应该是 Redis API,但是你在哪里连接到 Redis 并存储它的连接?

是的,这是一个非常好的评论,有助于从评论员那里澄清概念。

如果你的 Redis 服务器在系统中 运行 然后需要以 Rails 自己的方式配置它,我会写一些配置文件 & 如果你已经创建了你可以比较这些 & 如果您直到现在才创建,我认为这是问题所在,如果您需要此功能,需要尽快创建。

首先,安装 gem redis-rails

gem 'redis-rails'

之后将其添加到环境文件中

config.cache_store = :redis_store, {
    host: "localhost",
    port: 6379,
    db: 0,
    password: "mysecret",
    namespace: "cache"
}, {
    expires_in: 90.minutes
}

app/config/initializer/ 中创建一个文件,然后 redis.rb 将其放入

$redis = Redis.new(:host => 'localhost', :port => 6379)

全部重启服务器后检查一下。

确保 redis-server 是 运行。

希望它能奏效。