我有一个非常简单的设置,我在其中进行API调用,该调用调用一个函数,该函数将初始化类的实例。 奇怪的是,它第一次工作,但是刷新页面的任何其他尝试都会给我一个未初始化的常量错误,用于正在初始化的类。 下面是一个示例
导轨 3.1红宝石 2.0
在app/controllers/static_pages_controller.rb
class StaticPagesController < ApplicationController
require_relative 'test.rb'
def about
build_fleet()
render text: "This worked"
end
end
在我的app/controllers/test.rb
:
class Fleet
def initialize(side)
@ships = []
@passive_abilities = []
@side = side
end
end
def build_fleet()
att_fleet = ::Fleet.new("att")
def_fleet = ::Fleet.new("def")
end
我去localhost/static_pages/about
得到"这工作了"。 点击刷新并查看"队列未初始化"以及相应的队列堆栈。
当我检查服务器日志时,我看到
>Started GET "/static_pages/about" for 127.0.0.1 at 2014-04-05 15:52:39 -0700
> Processing by StaticPagesController#about as HTML
>Completed 500 Internal Server Error in 4ms
>
>NameError (uninitialized constant Fleet):
> app/controllers/test.rb:10:in `build_fleet'
> app/controllers/static_pages_controller.rb:4:in `about'
重新加载时出了什么问题?
这似乎与开发模式下的 rails 如何尝试在每个请求上自动重新加载代码有关。
尝试此答案中的建议,并将呼叫require_relative替换为require_or_load "./test.rb"
*编辑:*我认为正在发生的事情是,在开发模式下的每个请求结束时,rails 都会取消定义它所知道的大多数常量。(类是常量。
下一个请求进来,你要求 ruby 加载文件。但是由于第二个请求是同一过程的一部分,Ruby 记得它已经加载了test.rb
,因此被跳过了。
但是,看起来Fleet
是一个模型(即使不是数据库支持的模型)。我会把它放在app/models/fleet.rb
,导轨会自动加载它。