Ruby on rails 无论何时Gem-未定义的方法';(methodhere)和#x27;对于用户(调用';User.connection';以建立连接):类

Ruby on rails 无论何时Gem-未定义的方法';(methodhere)和#x27;对于用户(调用';User.connection';以建立连接):类,ruby-on-rails,ruby,whenever,Ruby On Rails,Ruby,Whenever,我正试图在我的ROR5应用程序中实现这个功能。每年一次,我希望它在我的“用户”模型中运行一个方法,但出于测试目的,我每分钟运行一次,如下所示: Please specify a valid ruby command or the path of a script to run. Run 'bin/rails runner -h' for help. undefined method `(methodhere)' for User (call 'User.connection' to esta

我正试图在我的ROR5应用程序中实现这个功能。每年一次,我希望它在我的“用户”模型中运行一个方法,但出于测试目的,我每分钟运行一次,如下所示:

Please specify a valid ruby command or the path of a script to run.
Run 'bin/rails runner -h' for help.

undefined method `(methodhere)' for User (call 'User.connection' to 
establish a connection):Class
附表2.rb:

set :output, "/home/ubuntu/workspace/log/cron.log"

every 1.minute do
    runner "User.(methodhere)"
end
User.rb:

def (methodhere)
  User.all.each do |user|
    user.update(remaining_days: user.total_days)
  end
end
在很多地方我都读到过,有时cronjobs在开发模式下不能正常运行,所以我千方百计将我的应用程序投入生产模式,但这并没有帮助

然后,我发现您可以在命令行中手动运行这些作业,然后我尝试使用以下命令:

whenever --update-cron
然后

这表明

# Begin Whenever generated tasks for: 
/home/ubuntu/workspace/config/schedule.rb
* * * * * /bin/bash -l -c 'cd /home/ubuntu/workspace && bundle exec bin/rails 
runner -e production '\''User.year_days_reset'\'' >> 
/home/ubuntu/workspace/log/cron.log 2>&1'
运行

/bin/bash -l -c 'cd /home/ubuntu/workspace && bundle exec bin/rails 
runner -e production '\''User.(methodhere)'\'' >> 
/home/ubuntu/workspace/log/cron.log 2>&1'
在日志中给我留下了一个错误,如下所示:

Please specify a valid ruby command or the path of a script to run.
Run 'bin/rails runner -h' for help.

undefined method `(methodhere)' for User (call 'User.connection' to 
establish a connection):Class
很多谷歌搜索都让我一无所获

注意:在rails控制台中手动运行我的方法(methodhere)可以完美地满足我的需要。我是RoR的一个非常新的开发者,所以任何关于这个问题的指导都将非常感激,谢谢


编辑:@maxpleaner指出我在User.new.(methodhere)中缺少.new,这修复了错误,但我有一个新问题。我在schedule.rb中的代码似乎没有执行任何操作,因为它应该每分钟发生一次,但它什么也没做。

您必须有一个用户类方法

class User
  def self.method
    ...
  end
end

通过这种方式,您可以在计划文件中使用User.method。

如果您要调用像
User.some\u method
这样的方法,它必须是类方法,否则使用
User.new.some\u method
@maxpleaner就是这样!非常感谢你,仍然在学习正确的ruby语法等等,像这样的小蠢事一直发生在我身上。@maxpleaner虽然这确实解决了错误问题,但现在我有了一个新问题;我的代码现在似乎什么都没做。在控制台中手动运行User.new.(methodhere),如果它现在正在与User.new.(methodhere)一起工作,那么仍然会执行它应该执行的操作。这样做会对它的正常工作产生任何影响吗?还有,我在哪里上这门课?抱歉,我对RoR和正确的文件放置还很陌生。我的anwers工作方式不需要创建新的用户实例。如果执行User.new,则将创建一个新的User实例。而是定义一个类方法并执行User.method。如果您创建一个新的用户实例,则每次运行该任务时都会为该对象节省内存空间,使用类方法可以避免可能的内存泄漏。