Этот вопрос довольно старый, но я чувствую, что он может использовать немного более сложный процесс. Это правда, что вы можете обезопасить рельсы (и рубины) во время выполнения. Это означает, что легко открыть класс или модуль и ввести новый код. Тем не менее, это несколько сложнее в рельсах из-за загрузки и разгрузки динамического класса, который идет в режиме разработки.
Я не буду вдаваться в подробности, но вы действительно хотите поместить свои расширения в инициализатор или драгоценный камень, так как они перезагружаются между запросами в режиме dev. Если вы поместите код в плагин, он не будет перезагружен, и вы получите очень загадочные ошибки, такие как «Копия XXX была удалена из дерева модулей, но по-прежнему активна!»
Проще всего сделать, это бросить код в инициализатор (например, config/initializers/user_extensions.rb). Вы можете просто использовать class_eval для ввода кода.
User.class_eval do
... new code ...
end
Одним из основных недостатков расширяемости рубинов является отслеживание того, откуда поступает код. Возможно, вам захочется добавить какое-то сообщение в журнале о загружаемых расширениях, чтобы люди могли его отслеживать.
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
Я пытаюсь сделать очень похожую вещь. Мне жаль, что у меня не было образца кода, в котором объяснялось, как это сделать. – Andrew