Подклассовая модель приводит к NameError в среде разработки, но не в тесте - PullRequest
0 голосов
/ 27 марта 2009

Это моя модель действий:

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

Теперь, когда я проверяю это, если это работает в моих модульных тестах, все, кажется, работает. Но как только я запускаю веб-сервер в режиме разработки, я получаю следующее:

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

Почему он думает, что Fold существует в пространстве имен Deal? И почему этого не происходит в тестовой среде?

Ответы [ 3 ]

1 голос
/ 27 марта 2009

Это не значит, что 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" в deal.rb, потому что проблема в том, что ваш тестовый код загружает action.rb (возможно, через какой-то другой тест), но ваш рабочий код - нет.

0 голосов
/ 27 марта 2009

Я не использую Rails на работе, но иногда я сталкиваюсь со сценарием, когда класс известен, когда я запускаю тесты, но не когда я запускаю исполняемый файл. Это происходит из-за того, что в моих тестовых файлах есть соответствующие операторы «require» для соответствующих файлов, но у меня не было возможности поместить необходимые операторы «require» в производственный код.

0 голосов
/ 27 марта 2009

В Ruby добавить метод к классу, который вы объявили следующим образом:

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

Это может быть источником ваших проблем.

Также (извините, чтобы выбрать), но вам не нужна скобка на Fold.new. Вы можете передавать параметры в методы без использования parathesis.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...