这是我的行动模式:
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存在于命名空间中?为什么这不会在测试环境中发生?
答案 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的情况下将参数传递给方法。