Этот вопрос довольно старый, но я чувствую, что он может быть немного более конкретным. Это правда, что вы можете обезьяны рельсы (и рубин) во время выполнения. Это означает, что легко открыть класс или модуль и внедрить новый код. Тем не менее, это несколько сложнее в рельсах из-за всей динамической загрузки и выгрузки классов, которые идут в режиме разработки.
Я не буду вдаваться в подробности, но вы действительно хотите поместить свои расширения в инициализатор или гем, поскольку они перезагружаются между запросами в режиме разработки. Если вы поместите код в плагин, он не будет перезагружен, и вы получите очень загадочные ошибки, такие как «Копия XXX была удалена из дерева модулей, но все еще активна!»
Самое простое, что нужно сделать, это выбросить код в инициализатор (например, config / initializers / user_extensions.rb). Вы можете просто использовать class_eval для внедрения кода.
User.class_eval do
... new code ...
end
Одним из основных недостатков расширяемости ruby является отслеживание того, откуда поступает код. Возможно, вы захотите добавить какое-то сообщение в журнал о загружаемых расширениях, чтобы люди могли его отследить.
Rails.logger.info "\n~~~ Loading extensions to the User model from #{ __FILE__ }\n"
User.class_eval do
... new code ...
end
Дальнейшее чтение:
http://airbladesoftware.com/notes/monkey-patching-a-gem-in-rails-2-3