Subclassed模型在开发环境中导致NameError,但在测试中没有

时间:2009-03-26 21:03:04

标签: ruby-on-rails ruby

这是我的行动模式:

class Action < ActiveRecord::Base
end

class Fold < Action
end

class Check < Action
end

class Call < Action
end

class Bet < Action
end

在另一个模型中,我有这个

class Deal < ActiveRecord::Base
  def Deal.parse_action(action_string)
    case action_string
    when "folds":   Fold.new()
    when "checks":  Check.new()
    when "calls":   Call.new()
    when "bets":    Bet.new()
    when "raises":  Bet.new()
    else nil   
    end
  end
  # ...
end

现在,当我测试它,如果这在我的单元测试中有效,那么一切似乎都有效。但是当我在开发模式下启动Web服务器时,我得到了这个:

NameError (uninitialized constant Deal::Fold):
  app/models/deal.rb:115:in `parse_action'
  ...

为什么它认为Fold存在于命名空间中?为什么这不会在测试环境中发生?

3 个答案:

答案 0 :(得分:1)

并不是说Fold命名空间中存在Deal,而是说它正在查找常量Fold,而它当前位于Deal内。例如,试试这个:

class Foo 
  def test; puts Bar; end
end
Foo.new.test

你会得到这个:

NameError: uninitialized constant Foo::Bar
  from (irb):3:in `test'
  from (irb):7
  from :0

Rails有自动加载常量的东西,我猜测问题是你自己的文件中没有Fold类。尝试将Fold类定义放入其自己的文件 - app/models/fold.rb,看看是否有帮助。如果是这样,请尝试将其放回action.rb文件中,然后在执行Action语句之前执行会导致case文件加载的内容,例如x = Action之前的require "action.rb"语句statment。如果可以,那么您需要在deal.rb中{{1}},因为问题是您的测试代码正在加载action.rb(可能通过其他测试)但您的生产代码却没有。

答案 1 :(得分:0)

我没有在工作中使用Rails,但是我有时会遇到在运行测试时已知类的情况,但在我运行可执行文件时却没有。发生这种情况是因为我在相关文件的测试文件中有必要的“require”语句,但我没有把生成代码中的必需“require”语句放在一边。

答案 2 :(得分:-1)

在Ruby中为方法添加一个方法,如下所示:

  class Deal < ActiveRecord::Base
    def self.parse_action(action_string)
      case action_string
        when "folds":   Fold.new
        ....

这也可能是你问题的根源。

另外(很抱歉)但你不需要Fold.new上的括号。您可以在不使用parathesis的情况下将参数传递给方法。