2010-12-16 3 views
14

Я обезьяна-латание двигатель Rails с чем-то вроде:Как код обезьяны-патча, который автоматически загружается в Rails?

SomeClass.class_eval do 
    # ... 
end 

Первый раз, когда я попал на веб-сайте, в режиме разработки, по крайней мере, она работает, но второй раз это, как мой патч никогда не существовало , Я предполагаю, что Rails автоматически перезагружает двигатель (который установлен в поставщике /) и не перезагружает мой код. Это Rails 2.3.

Любые идеи, как это сделать, чтобы мой код также перезагрузился?

+0

Однажды я столкнулся с подобной проблемой, и единственный способ, которым я мог это исправить, - запустить рельсы в режиме производства на моей машине dev :(. Я также заинтересован в этом. – kikito 2010-12-16 12:40:29

+0

@egarcia: Надеюсь, на этот раз мы сможем найти лучшее решение. – Pablo 2010-12-16 12:42:08

+0

как вы управляете своим кодом, это webbrick, mongrel или пассажир? отправляйте рельсы и серверные версии. – mpapis 2010-12-20 23:15:43

ответ

0

К сожалению, нет способа зацепить механизм перезагрузки Rails 2.x. Что вы можете сделать, это место патча в каталоге приложения или lib. (lib/core_ext, вероятно, является предпочтительным местом). Затем добавьте каталог в autoload_paths в свой конфиг.

Возможно, вам также потребуется открыть класс, а не использовать class_eval.

+0

Обезьяна-патч уже находится в папке lib /, которая уже находится в autoload_paths на Rails 2. Я не уверен, почему, но открываю класс с ключевым словом class вместо результатов class_eval в ошибке, исключение, которое было позже отправлено. – Pablo 2010-12-16 13:01:12

4

Если вы поместите патч в любой файл .rb внутри/config/initializers, он должен работать.

0

Это некрасиво, но я обнаружил, что если я поставлю этот код в нижней части среды. Rb, он всегда гарантирует правильный порядок загрузки при запуске.

18

EDIT: Это решение работает только для Rails 3+, поскольку оно зависит от некоторых функций в Rails :: Railtie. Поместите этот код в инициализатор.

Этот вопрос довольно старый, но вот решение, которое я нашел:

Rails.configuration.to_prepare do 
    SomeClass.class_eval do 
    # ... 
    end 
end 

Это заставляет Rails перезагрузить класс по каждому запросу в режиме разработки, но только один раз в производстве.

5

Я только что написал свой первый патч обезьяны, и поэтому ему нужно было создать набор условностей вокруг него. Вот что я придумал:

  1. Место расширений под lib/ext/. (. Предложил ветеран workmad3 в #rubyonrails IRC комнате) В моем случае, я добавляю метод к Mail::Message классу (от mail драгоценного камня, используемого ActionMailer), так что я создал:

    /lib/ext/mail/message.rb

  2. Открытый класс или модуль и добавить код:

    module Mail class Message def to_is_phone? !!(self.to.first =~ /^\+1\d{10}$/) end end end

  3. Создать учетную initalizer, чтобы загрузить всю вашу обезьяну патчи. Rails будет автоматически загружать файл при указании константы, но поскольку вы добавляете методы к существующим классам/модулям, а не определяете новые, это не сработает, поэтому вам придется вручную потребовать все ваши патчи-обезьяны.Так что я создал:

    /config/initializers/monkey_patches.rb

    Который содержит:

    require 'ext/mail/message'

 Смежные вопросы

  • Нет связанных вопросов^_^