Zauważyłem, co następuje:
Pełny silnik
W przypadku pełnego silnika aplikacja nadrzędna dziedziczy trasy z silnika. Nie trzeba niczego określać w parent_app/config/routes.rb
. Określenie klejnotu w Gemfile wystarczy, aby aplikacja nadrzędna odziedziczyła modele, trasy itp. Trasy silnika są określone jako:
# my_engine/config/routes.rb
Rails.application.routes.draw do
# whatever
end
Brak przestrzeni nazw modeli, kontrolerów itp. Są one natychmiast dostępne dla aplikacji nadrzędnej.
Zamontowany silnik
Przestrzeń nazw silnika jest domyślnie izolowana:
# my_engine/lib/my_engine/engine.rb
module MyEngine
class Engine < Rails::Engine
isolate_namespace MyEngine
end
end
W przypadku silnika, który można montować, trasy są podzielone na przestrzenie nazw, a aplikacja nadrzędna może połączyć tę funkcję w jedną trasę:
# my_engine/config/routes.rb
MyEngine::Engine.routes.draw do
#whatever
end
# parent_app/config/routes.rb
ParentApp::Application.routes.draw do
mount MyEngine::Engine => "/engine", :as => "namespaced"
end
Modele, kontrolery itp. Są odizolowane od aplikacji nadrzędnej - chociaż pomocników można łatwo udostępniać.
To są główne różnice, które zauważyłem. Może są inni? Pytałem tutaj , ale jeszcze nie otrzymałem odpowiedzi.
Mam wrażenie, że ponieważ pełny silnik nie izoluje się od aplikacji nadrzędnej, najlepiej jest używać go jako samodzielnej aplikacji sąsiadującej z aplikacją nadrzędną. Uważam, że mogą wystąpić starcia nazw.
Mechanizm montowalny może być używany w sytuacjach, w których chcesz uniknąć konfliktów nazw i połączyć go w jedną konkretną trasę w aplikacji nadrzędnej. Na przykład pracuję nad zbudowaniem mojego pierwszego silnika przeznaczonego do obsługi klienta. Aplikacja nadrzędna może połączyć swoją funkcjonalność w ramach jednej trasy, takiej jak:
mount Cornerstone::Engine => "/cornerstone", :as => "help"
Jeśli moje przypuszczenia są dalekie ode mnie, niech ktoś da mi znać, a naprawię tę odpowiedź. Zrobiłem mały artykuł na ten temat tutaj Cheers!
mount MyEngine::Engine => "/"
. Działa w przypadku zasobów, być może dotyczy to również silników.Obie opcje wygenerują silnik . Różnica polega na tym,
--mountable
że utworzy silnik w izolowanej przestrzeni nazw, podczas gdy--full
utworzy silnik, który współużytkuje przestrzeń nazw głównej aplikacji.Różnice przejawiają się na 3 sposoby:
1) Plik klasy silnika wywoła
isolate_namespace
:lib / my_full_engine / engine.rb:
lib / my_mountable_engine / engine.rb:
2) Plik silnika
config/routes.rb
będzie miał przestrzeń nazw:Pełny silnik:
Zamontowany silnik:
3) Struktura plików dla kontrolerów, pomocników, widoków i zasobów będzie miała przestrzeń nazw:
Wyjaśnienie
Przypadek użycia tej
--full
opcji wydaje się być bardzo ograniczony. Osobiście nie mogę wymyślić żadnego dobrego powodu, dla którego chciałbyś podzielić swój kod na silnik bez izolowania przestrzeni nazw - w zasadzie dałoby ci to dwie ściśle powiązane aplikacje, które mają identyczne struktury plików i wszystkie konflikty i wyciek kodu to pociąga za sobą.Każdy fragment dokumentacji, który widziałem, demonstruje tę
--mountable
opcję, a obecny przewodnik po krawędziach zdecydowanie zachęca do uwzględnieniaisolate namespace
- co jest tym samym, co powiedzenie use--mountable
over--full
.Wreszcie pojawia się zamieszanie terminologiczne: niestety
rails plugin -h
pokazuje następujące opisy:Sprawia to wrażenie, jakbyś
--full
tworzył „silnik” i--mountable
coś innego, co nazywa się „montowalną aplikacją”, podczas gdy w rzeczywistości są to oba silniki - jeden z przestrzenią nazw, a drugi nie. To z pewnością prowadzi do nieporozumień, ponieważ użytkownicy, którzy chcą stworzyć silnik, prawdopodobnie uznają, że--full
jest to bardziej odpowiednia opcja.Wniosek
rails plugin new something --full
= Silnik w przestrzeni nazw aplikacji. (Dlaczego miałbyś?)rails plugin new something --mountable
= Silnik z własną przestrzenią nazw. (Niesamowite)Bibliografia
źródło
--full
: jeśli masz części strony internetowej rails, które chcesz zachować zintegrowane (nie w izolowanej przestrzeni nazw) i nadal udostępniać je innym projektom railsów. Może być też prostsze: może twój klejnot nie dodaje tak dużo, ale chcesz mieć możliwość prawidłowego zaczepienia.Admin::AdminService.some_action
ale nie musisz zmieniać tras, jeśli inne aplikacje po stronie klienta, takie jak aplikacja Ember, używają tras związanych z kodem, chcą się odizolować. --full wydaje się być krokiem pośrednim, który może być łatwiejszy do wdrożenia.zastanawiałem się nad tym samym i dlatego wylądowałem tutaj. wydaje mi się, że wcześniejsze odpowiedzi zasadniczo pokrywają pytanie, ale pomyślałem, że poniższe mogą również pomóc:
szczególnie interesujący (mnie) jest fakt, że nie ma między nimi żadnej różnicy
i
źródło
--full
ma pierwszeństwo--mountable
?Rozumiem różnicę, że silniki są jak wtyczki i dodają funkcjonalność do istniejących aplikacji. Chociaż aplikacje, które można montować, są zasadniczo aplikacjami i mogą istnieć samodzielnie.
Więc jeśli chcesz mieć możliwość uruchomienia go samodzielnie lub w innej aplikacji, stworzyłbyś aplikację do zamontowania. Jeśli chcesz, aby był on dodatkiem do istniejących aplikacji, ale nie działał samodzielnie, zrobiłbyś z niego silnik.
źródło
Uważam, że różnica polega na tym, że aplikacje, które można montować, są odizolowane od aplikacji hosta, więc nie mogą udostępniać klas - modeli, pomocników itp. Dzieje się tak, ponieważ aplikacja do montażu jest punktem końcowym Rack (tj. ).
Uwaga: jak większość, dopiero co zacząłem bawić się Railsami 3.1.
źródło