Tôi đã nhận thấy những điều sau:
Động cơ đầy đủ
Với một động cơ đầy đủ, ứng dụng mẹ kế thừa các tuyến từ động cơ. Nó không cần thiết phải chỉ định bất cứ điều gì trong parent_app/config/routes.rb
. Chỉ định gem trong Gemfile là đủ để ứng dụng mẹ kế thừa các mô hình, tuyến đường, v.v. Các tuyến động cơ được chỉ định như:
# my_engine/config/routes.rb
Rails.application.routes.draw do
# whatever
end
Không có vùng chứa tên của mô hình, bộ điều khiển, v.v. Chúng có thể truy cập ngay vào ứng dụng mẹ.
Động cơ gắn được
Không gian tên của công cụ được cô lập theo mặc định:
# my_engine/lib/my_engine/engine.rb
module MyEngine
class Engine < Rails::Engine
isolate_namespace MyEngine
end
end
Với một công cụ có thể gắn kết, các tuyến được đặt ở vị trí tên và ứng dụng mẹ có thể gói chức năng này theo một tuyến:
# 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
Mô hình, bộ điều khiển, v.v. được cách ly khỏi ứng dụng mẹ - mặc dù có thể chia sẻ dễ dàng các trình trợ giúp.
Đây là những khác biệt chính mà tôi đã phát hiện ra. Có lẽ có những người khác? Tôi đã hỏi qua đây , nhưng vẫn chưa nhận được phản hồi.
Ấn tượng của tôi là vì một công cụ đầy đủ không tự cô lập chính nó khỏi ứng dụng mẹ, nó tốt nhất được sử dụng như một ứng dụng độc lập liền kề với ứng dụng mẹ. Tôi tin rằng có thể xảy ra đụng độ tên tuổi.
Một công cụ có thể gắn được có thể được sử dụng trong các tình huống mà bạn muốn tránh xung đột tên và gói công cụ theo một tuyến cụ thể trong ứng dụng mẹ. Ví dụ: tôi đang làm việc để xây dựng động cơ đầu tiên được thiết kế cho dịch vụ khách hàng. Ứng dụng gốc có thể gói chức năng của nó theo một tuyến như:
mount Cornerstone::Engine => "/cornerstone", :as => "help"
Nếu tôi đang chệch hướng trong các giả định của mình, ai đó vui lòng cho tôi biết và tôi sẽ sửa câu trả lời này. Mình có làm một bài viết nhỏ về chủ đề này Cheers!