LoadError:需要 {app_path}/models/model file.rb 来定义模型名称

2024-03-18

运行此程序时出现此错误

LoadError: Expected /home/user/Desktop/Tripurari/myapp/app/models/host.rb to define Host##

但每样东西都在它的位置上。有人可以告诉我下面方法的确切问题是什么吗?

def self.check_all(keyword)
  memo_mutex = Mutex.new
  memo       = {}
  threads    = []
  name       = keyword.keyword
  SITES.each do |site_and_options|
    threads << Thread.new do
      @host = Host.find_or_create_by_name(site)
      if keyword.unavailable_usernames.find_by_host_id(@host.id)
        memo[@host.name] = true
      else
        memo[@host.name] = false
      end
    end
  end
  threads.each { |t| t.join }
  memo
end

该问题可能是由自动加载器引起的。如果Host当第一次进入创建几个新线程的循环时,类尚未加载,它是自动加载的,即 Rails 在加载路径中搜索与命名约定匹配的文件并需要它。

这个过程不是线程安全的。在您的情况下,当您快速连续创建多个线程时,每个线程都尝试自动加载global类中,你会遇到竞争条件,奇怪的事情就会发生。基本上,您有两种选择来解决这个问题:

  1. 您可以在启动线程之前显式加载模型,方法是使用require 'host'在开始循环之前。
  2. 或者你可以设置config.threadsave!在初始化程序中。这将(除其他外)在启动服务器时预加载所有类。这是首选方法,因为这样可以避免大量其他难以调试的并发问题。欲了解更多信息config.threadsafe!,请参考亚伦·帕特森的精彩文章 http://tenderlovemaking.com/2012/06/18/removing-config-threadsafe.html认为应该在 Rails 4 中将其完全删除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LoadError:需要 {app_path}/models/model file.rb 来定义模型名称 的相关文章

随机推荐