我有一个非常简单的设置,我在其中进行API调用,它调用一个函数,它将初始化一个类的实例。奇怪的是,它第一次工作,但任何额外的刷新页面的尝试都会给我一个初始化的类的未初始化的常量错误。这是一个例子
Rails 3.1 Ruby 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
并获得“这个工作”。点击刷新并看到“Fleet uninitialized”与相应的车队堆栈完成。
当我查看服务器日志时,我看到了
>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'
重装上出了什么问题?
答案 0 :(得分:2)
这似乎与开发模式中的rails如何尝试在每个请求上自动重新加载代码有关。
尝试使用this answer中的建议,并将对require_relative的调用替换为require_or_load "./test.rb"
*编辑:* 我认为发生的事情是,在开发模式的每个请求结束时,rails都会定义它知道的大多数常量。 (类是常量。)
下一个请求进来,你要求ruby加载文件。但由于第二个请求是同一个过程的一部分,因此ruby会记住它已经加载了test.rb
,因此它被跳过了。
然而,看起来Fleet
是一个模型(即使不是数据库支持的模型)。我将它放在app/models/fleet.rb
中,rails会自动加载它。