1. ホーム
  2. ruby-on-rails-3

[解決済み] Rails 3.1。エンジン vs. マウント可能なアプリ

2022-08-26 03:13:49

質問

RailsエンジンとMountableアプリの違いを理解するのを手伝ってくれる人はいますか? Rails 3.1では、"rails new pluginでどちらかを作成することができます。 _ __ "コマンドを実行します。

rails plugin new forum --full        # Engine
rails plugin new forum --mountable   # Mountable App

どのような場合にどちらかを使いたいのでしょうか? 例えば、エンジンをgemとしてパッケージ化できることは知っています。 マウント可能なアプリの場合はそうではないのでしょうか? 他にどのような違いがあるのでしょうか?

どのように解決するのですか?

以下のことに気づきました。

フルエンジン

フルエンジンでは、親アプリケーションはエンジンからルートを継承します。 この場合 parent_app/config/routes.rb . Gemfileでgemを指定するだけで、親アプリがモデルやルートなどを継承することができます。 エンジンルートは以下のように指定します。

# my_engine/config/routes.rb 
Rails.application.routes.draw do 
  # whatever 
end 

モデルやコントローラなどの名前空間はありません. これらはすぐに 親アプリケーションからアクセス可能です。

マウント可能なエンジン

エンジンの名前空間はデフォルトで分離されています。

# my_engine/lib/my_engine/engine.rb
module MyEngine 
  class Engine < Rails::Engine 
    isolate_namespace MyEngine 
  end 
end

マウント可能なエンジンでは、ルートは名前空間であり、親アプリはこの機能を1つのルートの下にバンドルすることができます。

# 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 

モデル、コントローラなどは親アプリケーションから分離されています。ただし、ヘルパーは簡単に共有できます。

これらは私が見つけた主な違いです。 おそらく他にもあるのでしょう。 私は はこちら で質問しましたが、まだ回答がありません。

私の印象では、フル エンジンは親アプリケーションから分離されないので、親アプリに隣接するスタンドアロン アプリケーションとして使用するのが最善だと思います。 名前の衝突が発生する可能性があると思います。

マウント可能なエンジンは、名前の衝突を避け、エンジンを親アプリケーションの 1 つの特定のルートの下にバンドルしたい状況で使用できます。 たとえば、私はカスタマー サービス用に設計された最初のエンジンを構築することに取り組んでいます。 親アプリケーションは、次のような単一のルートの下にその機能をバンドルすることができます。

mount Cornerstone::Engine => "/cornerstone", :as => "help" 

もし私の仮定が大きく外れていたら、どなたか教えてください、このレスを修正します。 私はこのテーマについて小さな記事を作りました ここに 乾杯!