2010-10-19 1 views
0

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

Простой пример был бы:

# 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 %> 

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

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

ответ

0

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

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

я использовал этот подход, чтобы писать плагин до и overload active record

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

+0

Спасибо за идею. Кажется, он не работает для меня, я думаю, потому что root/lib/person.rb определяет класс Person и загружается автоматически. vendor/plugins/plugin1/lib/person.rb вообще не загружается. –

+0

У вас есть файл 'vendor/plugins/plugin1/plugin1.rb', который содержит строку, такую ​​как' require 'person? ', Я думаю, что плагины загружаются через файлы, соответствующие' vendor/plugins/*. Rb' so для многофайлового плагина у вас обычно есть один файл rb в базе, который требует всех остальных, которые находятся в директории и т. д. – Jeremy

+0

Да, но если мне нужен поставщик/плагины/plugin1/lib/person.rb из этого файла, определяется в person.rb только для первого запроса. Я думаю, что это происходит из-за того, что приложение/lib/person.rb загружается автоматически, что устраняет и переопределяет константу Person для каждого нового запроса, а затем person.rb в плагине не загружается снова. –