W jaki sposób mogę dołączyć plik z widokiem do pluginu?
Piszę plugin który między innymi rozszerza klasę ActionView::Base o metodę która zwraca trochę kodu js i html i chciałbym sobie ten kod dla przejrzystości przenieść do osobnego pliku. Próbowałem to rozwiązać w następujący sposób:
w katalogu lib pluginu dodałem katalogi models i views
w katalogu lib/views mam plik _languages_tag.erb ze wspomnianym kodem js+html
na końcu metody modułu który rozszerza ActionView::Base dodałem
require 'lang_forms'
require 'models/lang_vars'
require 'views/_languages_tag'
class ActionView::Base
include Unlink::Lang::Vars
end
opisane wyżej rozwiązanie wywala się na dołączaniu pliku views/_languages_tag
/usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- views/_languages_tag (MissingSourceFile)
ok, ale muszę później jakoś dołączyć pliki z katalogu lib/app/views pluginu w init.rb? czy railsy same sobie tam poszukają. No i podstawowe pytanie czy mogę w module wywoływać metodę render (tzn mogę, bo działa, ale czy ona nie szuka zawsze w app/views, pomijając pluginy)? Pytam, bo przenosiny do app niestety nie rozwiązały opisanego wyżej problemu
EDIT
w odpowiedzi - nie, same sobie nie poszukają trzeba je dodać do ścieżek ładowania, w moim przypadku to wygląda tak:
%w{ models views }.each do |dir|
path = File.join(File.dirname(__FILE__), 'lib/app', dir)
$LOAD_PATH << path
ActiveSupport::Dependencies.load_paths << path
ActiveSupport::Dependencies.load_once_paths.delete(path)
end
wygląda na to, że tak restartowałem wiele razy i dopiero ten wygooglowany kod pomógł
EDIT
niestety nie jest tak różowo jak napisałem - owszem przedstawiony kod ładnie ładuje modele z lib/app/models pluginu ale niestety plików widoku z pluginu (lib/app/views) już railsy nie widzą. Wczoraj w trakcie zabaw z tym pluginem przeniosłem sobie widok z plugin/lib/app/views do app/views i dlatego dzisiaj, zapomniawszy o tym fakcie zdawało się, że wszystko działa. Czy niestety moje pytanie powraca - jak załadować pliki widoku w pluginie i czy w ogóle mogę używać render w kodzie pluginu?
rzeczywiście, na guides.rubyonrails.com piszą tak jak Ty. Teraz staje przed bardzo fajnym pytaniem, dlaczego mój kod działa bez tego?
EDIT: railsy od wersji 2.3 automatycznie ładują te wszystkie modele, widoki, helpery i kontrolery, co mają w pluginach w katalogu app. Zupgrejduj sobie railsy
dobra, kolejno bo gdzieś coś źle robię. Moje railsy:
rails --version
Rails 2.3.5
struktura katalogów w moja_aplikacja/vendor/plugins/moj_plugin:
root@m4r1u5z lang_vars]# tree
.
|-- MIT-LICENSE
|-- README
|-- Rakefile
|-- init.rb
|-- install.rb
|-- lib
| `-- app
| |-- models
| | |-- lang_forms.rb
| | `-- lang_vars.rb
| `-- views
| `-- _languages_tag.erb
|-- tasks
| `-- lang_vars_tasks.rake
|-- test
| |-- lang_vars_test.rb
| `-- test_helper.rb
`-- uninstall.rb
jeśli nie ma przedstawionego wyżej kodu w pliku init.rb to railsy tego pluginu nie widzą (nie ładują go automatycznie), przedstawiony kod nie ładuje pliku z widoku.