Plugin i widoki

Witam,

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:

  1. w katalogu lib pluginu dodałem katalogi models i views
  2. w katalogu lib/views mam plik _languages_tag.erb ze wspomnianym kodem js+html
  3. na końcu metody modułu który rozszerza ActionView::Base dodałem
render :partial => 'views/languages_tag', :locals => { :locales => locales, :name => name }

plik init.rb

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)

Ścieżka do widoku w pluginie jaką musisz zrobić w katalogu pluginu jest identyczna jak w całym projekcie:

[quote]app/models
app/views[/quote]

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

A to ciekawe. Naprawdę jest tak jak piszesz? Bo ja nie pamiętam takich zabaw. Może wystarczyłoby zrestartować serwer i by śmigało

wygląda na to, że tak :slight_smile: restartowałem wiele razy i dopiero ten wygooglowany kod pomógł :wink:

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.

A spróbuj przenieść katalog app do katalogu głównego pluginu.

działa, dzięki ! ;D