Ruby on rails XXX的副本已从模块中删除,但仍处于活动状态
我基本上运行一个后台进程,检查文件,然后根据文件中发现的数据更新rails模型。但是,由于错误,我无法从线程内访问模型 下面是我的例子:Ruby on rails XXX的副本已从模块中删除,但仍处于活动状态,ruby-on-rails,ruby,Ruby On Rails,Ruby,我基本上运行一个后台进程,检查文件,然后根据文件中发现的数据更新rails模型。但是,由于错误,我无法从线程内访问模型 下面是我的例子: def check_logs while @start == 1 results = Dir.glob("#{@path}/*.txt") unless results.empty? results.each do |result| file_name = resu
def check_logs
while @start == 1
results = Dir.glob("#{@path}/*.txt")
unless results.empty?
results.each do |result|
file_name = result.split("/")[-1]
data = File.open(result).read
if file_name.include? "get"
data_contents = data.split("\n")
time = data_contents[0]
ExamResult.create(time: time)
end
FileUtils.rm_rf result
end
end
sleep 5
end
end
def start_agent
@start = 1
Thread.start {check_logs}
end
def stop_agent
@start = 0
end
但是,当它在后台时,我在控制台上看到的错误是:
异常终止(异常报告为真):
回溯(最近一次呼叫上次):5:from
portal/lib/custom\u rb/exam\u results/exam\u custom.rb:69:inblock in
启动\u监视\u代理“4:从
portal/lib/custom\u rb/test\u results/test\u custom.rb:40:in
检查日志'
3:从门户/lib/custom\u rb/exam\u results/exam\u custom.rb:40:ineach'
2:从门户/lib/custom\u rb/exam\u results/exam\u custom.rb:46:in
block
在check_日志“1:来自
/home/nutella/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active\u support/dependencies.rb:202:inconst\u missing'
/home/user/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active\u support/dependencies.rb:496:in
load\u missing\u constant:“ExamResult的副本已从中删除”
模块树,但仍处于活动状态!(错误)
我在这里的目标只是有一个后台流程来监控日志。我已经看到了一些关于同样的错误的帖子,但是也许我可以做得比为他们提供的解决方案好一点
任何想法或反馈都将不胜感激。我认为提供的错误与上述代码无关。 通常,使用元编程在运行时修改类时会发生此错误
看看您需要的地方,定义
ExamResult
,看起来您在代码中多次需要它。我不认为提供的错误与上述代码有关。
通常,使用元编程在运行时修改类时会发生此错误
看看您需要的地方,定义
ExamResult
,看起来您在代码中多次需要它。是的,这是ExamResult提到的唯一功能。如果我删除Thread.start{check_logs},我永远不会得到错误。一开始它似乎工作得很好,但如果我刷新网页,几乎就像我调用该模型的能力消失了一样。这是因为Rails在页面刷新时重新加载模型,而之前指向ExamResult的常数不再可用。我不建议您在Rails应用程序的范围内编写线程化代码。以Sidekiq gem为例。这对你来说是安全的,明白了。我试过sidekiq,但看起来你不能阻止一个sidekiq工人,对吗?例如,这段代码检查一个实例变量,看它是否改变了,如果改变了,它就会停止。但是,我不认为我可以在sidekiq中实现同样的功能。不,您可以在sidekiq worker中实现几乎相同的逻辑。如果满足某些条件,那么您可以从sidekiq作业的perform
方法返回,它将停止,直到安排下一个作业。作为替代方案,您可以尝试gem,它是为编写长期运行的应用程序和服务器而构建的。当然可以my_object.reload'应该从数据库中提取更改的属性。是的,这是ExamResult提到的唯一一个函数。如果我删除Thread.start{check_logs},我永远不会得到错误。一开始它似乎工作得很好,但如果我刷新网页,几乎就像我调用该模型的能力消失了一样。这是因为Rails在页面刷新时重新加载模型,而之前指向ExamResult的常数不再可用。我不建议您在Rails应用程序的范围内编写线程化代码。以Sidekiq gem为例。这对你来说是安全的,明白了。我试过sidekiq,但看起来你不能阻止一个sidekiq工人,对吗?例如,这段代码检查一个实例变量,看它是否改变了,如果改变了,它就会停止。但是,我不认为我可以在sidekiq中实现同样的功能。不,您可以在sidekiq worker中实现几乎相同的逻辑。如果满足某些条件,那么您可以从sidekiq作业的perform
方法返回,它将停止,直到安排下一个作业。作为替代方案,您可以尝试gem,它是为编写长期运行的应用程序和服务器而构建的。当然可以my_object.reload'应该从数据库中提取更改的属性。您在使用spring吗?您在使用spring吗?