Ruby / Rails: повторное открытие и перезапись класса - PullRequest
12 голосов
/ 16 декабря 2010

Я хочу добавить метод в модель Rails, который будет использоваться при тестировании.Если я сделаю это

class Model
  def something_new
    do_something
  end
end

в консоли Rails или в файле, загруженном во время выполнения, Модель будет перезаписана, а не изменена.Если я добавлю что-то вроде v = Model.class перед строками выше, новый метод будет успешно добавлен в существующий класс.Очевидно, что ссылка необходима для того, чтобы указать, что существующий класс повторно открывается.

С другой стороны, можно добавить метод, скажем, к Fixnum, не обращаясь к нему сначала.Что здесь происходит, и как обычно обеспечить повторное открытие и изменение существующего класса, а не перезапись?

Спасибо.

Ответы [ 3 ]

12 голосов
/ 16 декабря 2010

Звучит так, будто вам не нужен класс перед его использованием.Когда вы пишете Model.class и класс Model отсутствует, Rails автоматически вводит модель для вас.Если вы просто напишите class Model, он просто увидит это как определение класса.Просто require 'model' должно работать.

4 голосов
/ 31 января 2011

Используйте class_eval, таким образом, вы будете правильно открывать класс.
Вот очень хорошая статья о повторном открытии классов .

0 голосов
/ 01 ноября 2018

Так же, как дополнение к Чаку , ответом здесь является цитата из Rails docs :

6.1.1 Константы после класса и модуляКлючевые слова Ruby выполняет поиск константы, следующей за ключевым словом класса или модуля, потому что ему необходимо знать, будет ли класс или модуль создан или открыт.

Если константа не определена в этой точке, онане считается отсутствующей константой, автозагрузка запускается , а не .

...