2012-07-04 39 views
3

我收到此错误,运行此LoadError:预期{} APP_PATH /模型/模型file.rb定义型号名称

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 

回答

0

假设您在上面引述的代码是一个模型的.rb文件,添加require_relative "host"到该文件的顶部。

6

该问题可能是由自动装载机造成的。如果Host类在第一次进入创建一对新线程的循环时尚未加载,它将自动加载,即Rails会在加载路径中搜索匹配命名约定并需要它的文件。

此过程不是线程化。就你而言,由于你正在快速连续创建servral线程,每个尝试自动加载类,你会得到竞争条件和奇怪的事情发生。基本上,你有解决这个两个选项:

  1. 可以明确您开始之前,循环使用require 'host'开始你的线程之前加载模型。
  2. 或者您可以在初始化程序中设置config.threadsave!。这将(除其他外)在启动服务器时预加载所有类。这是首选,因此避免了一大堆其他难以调试的并发问题。有关config.threadsafe!的更多信息,请参阅excellent article by Aaron Patterson争辩它应该在Rails 4中完全删除。