Открыть автоматически загруженный класс из плагина Rails 3? - PullRequest
0 голосов
/ 20 октября 2010

У меня есть приложение Rails 3, которое определяет некоторые классы как обычные.Я пытаюсь выяснить, как заново открыть один из этих классов в плагине (генерируемый «rails generate plugin ...»), и автоматически иметь оба файла (файл в самом приложении и файл в плагине)перезагрузить каждый запрос в режиме разработки.

Простой пример:

# root/lib/person.rb
class Person
  Core = 1
end

# root/vendor/plugins/plugin1/lib/person.rb
class Person
  Plugin = 2
end

# root/app/views/home/index.html.erb
<%= Person::Core %> ... <%= Person::Plugin %>

Когда рендерится это представление, я получаю ошибку, что Bike :: Plugin не инициализирован.Я добавил root / lib и root / vendor / plugins / plugin1 / lib в мои autoload_paths (в идеале плагин добавил бы это в свой init.rb или где-то похожее, но по одной вещи за раз).

Как мне это сделать?Похоже, autoload_at может помочь, если я могу сказать, что он явно загружает класс Person из обоих мест, но мне не повезло (хотя я совершенно новичок в этом, поэтому я могу передавать неправильные аргументы и т. д.).В конце я хочу сделать это с классами, определенными в стандартных местах (в частности, с моделями), а не только с lib.

1 Ответ

0 голосов
/ 20 октября 2010

Один хороший способ, которым плагины могут переопределять более ранние определения для любого ранее определенного класса (или ваших библиотек, или внутренних компонентов rails и т. Д.):

#vendor/plugins/myawesomeplugin/lib/person.rb
Person.class_eval do
  Plugin = 2
  # override methods here too if you want
  def name
    "hacked"
  end
end

Я использовал этот подход для написания плагинов раньше и перегрузка активной записи

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

...