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!