Чтобы расширить ответ Райана, это соглашение Rails. В Rails 3, activesupport / lib / dependencies.rb имеет метод load_missing_constant, который будет искать GameState, когда вы ссылаетесь на него, и он еще не загружен. Он принимает отсутствующую константу GameState, вызывает подчеркивание, которое преобразует ее в game_state, а затем ищет ее в autoload_paths. Если он находит файл с таким именем (оканчивающийся на .rb), он загружает его.
В производственном режиме game_state.rb будет загружен сразу (при условии, что он находится в одном из autoload_paths), поэтому константа класса GameState уже будет загружена к моменту обращения к ней. В этом случае не нужно калечить.
Возможно, вы захотите поместить не-AR модели в отдельную папку; например, вы можете добавить к путям автозагрузки в config / application.rb, например:
config.autoload_paths += %W(#{config.root}/lib)
Тогда вы можете поместить класс GameState в lib / game_state.rb, и Rails найдет его.
Кстати, я не эксперт по Rails, но один из способов выяснить это - запустить отладчик Ruby и установить точки останова, где, кажется, происходит «волшебство»; затем вы можете использовать where или caller (0), чтобы вернуться и найти соответствующий код Rails. Иногда требуется несколько попыток со стратегическими точками останова (или путем добавления отладчика к исходному коду), но обычно это имеет смысл, когда вы видите, что это происходит построчно.