Поиск исходного местоположения модуля в Ruby 1.8.7 - PullRequest
1 голос
/ 25 января 2012

У меня есть проект Ruby on Rails, который некоторое время не затрагивался, и я пытаюсь обновить его с Rails 2.0 до 3.1.

Я получаю сообщение об ошибке, когда пытаюсь создать экземпляр одной из моделей. Кажется, что одна из моделей также определена где-то как модуль, и это мешает мне создать его экземпляр.

dgs@dgs-desktop ~/code/spelling $ rails c
Loading development environment (Rails 3.1.1)
ree-1.8.7-head :001 > Spelling.first
NoMethodError: undefined method `first' for Spelling:Module
    from (irb):1
ree-1.8.7-head :002 > exit

Класс правописания очень прост:

class Spelling < ActiveRecord::Base
  belongs_to :word, :class_name => 'Word', :foreign_key => 'word_id'
end

Я не могу найти, где в приложении (которое довольно мало) этот модуль будет определен:

dgs@dgs-desktop ~/code/spelling $ cd app
dgs@dgs-desktop ~/code/spelling/app $ grep Spelling * -R
models/spelling.rb:class Spelling < ActiveRecord::Base
models/word.rb:   has_many :spellings, :class_name => 'Spelling', :foreign_key => 'word_id'
models/spelling_user.rb:class SpellingUser < ActiveRecord::Base
views/layouts/application.html.erb:  <title> School Spelling Tests</title>

dgs@dgs-desktop ~/code/spelling/app $ find ./ -name "spelling*"
./views/spellings
./views/admin/spellings
./models/spelling.rb
./models/spelling_user.rb

Кто-нибудь знает, что может быть причиной этого? Или как еще я могу отследить, где этот модуль определяется?

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Попробуйте это:

Spelling.ancestors

, который даст вам все родительские классы и модули, который даст вам подсказку, где он находится. Если это не сработает, ищите переменную load_path:

y $LOAD_PATH

он выдаст вам список путей, но вам нужно будет найти тот, который конфликтует с вашим кодом. Это довольно много, но это не должно быть сложно, потому что большинство драгоценных камней хорошо распределены по именам, поэтому, скорее всего, это специальный патч, который где-то сидит.

0 голосов
/ 25 января 2012

Итак.,,,после долгих поисков в совершенно неправильном месте я нашел (очевидный) ответ.

dgs@dgs-desktop /tmp/spelling $ cat config/application.rb 
require File.expand_path('../boot', __FILE__)

require 'rails/all'

module Spelling
  class Application < Rails::Application
  ...
  end 
end

Где-то в процессе обновления с rails 2.x до rails 3.1 имя приложения становится модулем.Поскольку у меня была модель с тем же именем, что и у приложения, эта модель не удалась.

(я видел эту строку в application.rb во время моего greps, но не обращал на нее внимания)

Остальная часть приложения работала нормально, только когда я достиг чего-то в зависимости от этогомодель, которую он терпел неудачу.Когда я копировал все приложение по частям во временное приложение (называемое spelling_new), все работало, поэтому решил, что в исходном приложении это была какая-то глупость и переименовано в spelling_new -> spelling.В этот момент все снова взорвалось, и виновник стал ясен.

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