如何在Rails 3的开发模式下重新加载STI类?

3

在切换到Rails 3之后,我注意到必须重新启动服务器才能使STI模型类在每个请求中重新加载。例如,假设我有以下代码:

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

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

如果我对 Vehicle 进行更改,那么更改会在下一次请求时加载。但是如果我对 Car 进行更改,必须重新启动服务器才能加载。

有什么解决办法吗?

我正在运行 WEBrick,但我并不固执于它。

3个回答

2
我们发现在Rails 3.0.9中,为了使其正常工作,需要zetetic的解决方案和一些额外的代码。对于上述问题,解决方案可能如下所示:
在config/environments/development.rb中:
  config.after_initialize do
    ["vehicle"].each do|dep|
      require_dependency( (Rails.root + "app/models/#{dep}").to_s )
    end
  end

在app/controllers/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'来解决。


我认为require_dependency是私有API的一部分。而且,对我来说,这似乎是不必要的,因为STI和自动加载理论上已经支持了。我希望有一些解决方案可以涉及全局配置或修复我的开发服务器。 - rlkw1024
我同意这不应该是必要的,但它确实是。STI有一些需要解决的怪癖 - 这就是其中之一。 - zetetic

0

使用Rails 3.0.3和Passenger 3,我完全没有看到这个问题。如果将您的应用程序更新到3.0.3仍无法解决问题,我建议您放弃使用WEBrick。

我个人推荐使用其他服务器而不是WEBrick。Passenger已经成为我开发和生产环境中首选的服务器很长一段时间了。


绝对不涉及服务器相关...这里使用的是unicorn和thin...与Rails 3.0.9类似的问题... - todd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接