2012-07-04 70 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中完全刪除。