2011-01-05 51 views
3

切換到Rails 3後,我注意到我必須重新啓動我的服務器,使STI模型類重新加載每個請求。例如,假設我有這樣的:如何讓Rails 3在開發模式下重新加載STI類?

# app/models/vehicle.rb 
class Vehicle < ActiveRecord::Base 
end 

# app/models/car.rb 
class Car < Vehicle 
end 

如果我進行了更改Vehicle,這種變化被裝載在一個請求。但如果我對Car進行更改,則必須重新啓動我的服務器才能加載它。

修復此問題的任何想法?

我正在運行WEBrick,但我沒有承諾它。

回答

2

我們發現我們需要zetetic的解決方案和一些額外的代碼來完成這項工作(至少在Rails 3.0.9中)。對於上述問題,該解決方案將類似於:

在配置/環境/ development.rb:

config.after_initialize do 
    ["vehicle"].each do|dep| 
     require_dependency((Rails.root + "app/models/#{dep}").to_s) 
    end 
    end 

在應用程序/控制器/ application_controller.rb:

class ApplicationController < ActionController::Base 
    if Rails.env == 'development' 
    require_dependency((Rails.root + "app/models/vehicle").to_s) 
    end 
... 

代碼在development.rb中處理類的初始加載,並且ApplicationController中的代碼處理後續請求。

1

我相信這可以通過在控制器中添加require_dependency 'vehicle'來解決。

+0

我認爲require_dependency是私有API的一部分。另外,在我看來,這不應該是必要的,因爲STI和自動加載在理論上是支持開箱的。我希望有一些解決方案涉及全局配置或修復我的開發服務器。 – rlkw1024 2011-01-11 04:07:24

+0

我同意它不應該是必要的,但它是。性病有一些需要解決方法的怪癖 - 這是其中之一。 – zetetic 2011-01-11 07:09:35

0

使用導軌3.0.3和乘客3,我沒有看到這一點。如果將您的應用程序更新爲3.0.3並不能解決問題,我就會離開WEBrick。

我個人推薦使用WEBrick以外的東西。 Passenger一直是我開發+生產的首選服務器。

+0

絕對不是服務器相關的...獨角獸和薄這裏...導軌3.0.9相似的問題... – todd 2011-07-07 02:15:44

相關問題