多个轨道请求导致未初始化的常量



我有一个非常简单的设置,我在其中进行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,导轨会自动加载它。

相关内容

  • 没有找到相关文章