2016-10-31 12 views
18

Chcę użyć dynamicznej ścieżki w moim kontrolerze w klejnocie szyn.Railsy 4 + append_view_path

Dodałem do

module MyGem 
    class FooController < Config.controller 
    before_action ->{ append_view_path "app/views/my_gem/#{wizard_name}" } 
... 

i poglądów trzeba określić ścieżkę jak

app/views/my_gem/#{wizard_name}/my_gem/foo/some.erb 

w Rails jest jakiś sposób, aby przeciąć ścieżkę względną nazw gem i uzyskać odnośnika ścieżka jak?

app/views/my_gem/#{wizard_name}/some.erb 
# or 
foo/bar/some.erb 

Dziękujemy!

UPD:

Rozumiem, że istnieje droga z wyłączenie isolate_namespace w Engine, ale wierzę, że nie jest najlepszym i jedynym rozwiązaniem.

UPD2: Dla Rails4 ten pomysł był bardzo przydatny https://coderwall.com/p/p_yelg/render-view-outside-of-a-controller-in-rails-4

+3

Mam problem ze zrozumieniem, czego dokładnie chcesz. Czy mógłbyś podać przykład swoich poglądów? –

+0

wyświetlanie treści nie ma znaczenia w tym pytaniu, pytanie dotyczy tylko ścieżki przeglądania widoków. –

+0

A więc, jak wygląda twój 'view_paths', jak powinien wyglądać i jak wyglądał po użyciu' izol_namespace'? –

Odpowiedz

0

mógłby dokonać w jaki sposób uczynić metodę, która wczytuje dowolny plik, interpretować ERB i uczynić go jako strony HTML, na przykład.

ERB.new(File.read(Rails.root.join('foo', bar', 'some.erb'))).result(binding) 

Przekazując binding, szablon będzie miał dostęp do wszystkich zmiennych w bieżącym kontekście.

See ERB docs Szczegółowe informacje: http://apidock.com/ruby/ERB

0

Zakładając, że klejnot jest silnik, powinieneś być w stanie po prostu zadzwonić render :some w silniku. Jeśli aplikacja ma widok o nazwie <gem_name>/<controller_name>/some.html.erb, zostanie użyty.

Możesz również podać wersję tego widoku w swoim klejnocie, która będzie używana, jeśli aplikacja jeszcze go nie dostarczy.

Jeśli potrzebujesz również wizard_name, to najlepszym sposobem na zrobienie tego jest przeniesienie części ścieżki widoku do końca, w którym wywołujesz render.

Tak więc w swoim sterowniku klejnotu napiszesz render "#{wizard_name}/some" i będzie on wyglądał dla tego widoku zarówno w naszej aplikacji app/views/<gem_name>/<controller_name>/<wizard_name>/some.html.erb, jak i w twoim klejnocie app/views/<controller_name>/<wizard_name>/some.html.erb.