6

これは実験用です - --full でこれを行うことができることは承知していますが、競合を避けるためにアプリの名前空間の機能が必要でした

アイデアは、認証、共通アイテム、管理画面などを処理するメインアプリを持つことです。次に、エンジンを作成して、次のような機能を追加します。

  • クロム
  • cms
  • ブログ
  • ウィキ
  • フォーラム

これらのエンジンは、作成しているアプリの種類に応じて、必要に応じて選択できます。これは可能ですか?

--mountable と --full の両方のオプションを適用しただけですか?

実験中 - 完全なオプション add rspec を使用してから単純な追加を行った場合、問題は発生しますか?

rails plugin new plugin_name --skip-test-unit --full --dummy-path=spec/dummy

および lib\plugin_name\engine.rb 内

module PluginName
  class Engine < Rails::Engine

    # this is added by rails when an engine is mountable 
    # to isolate the plugin and prevent name clashes
    isolate_namespace PluginName

    # one of the additions to make rspec work from command line for the plugin
    config.generators do |g|
      g.test_framework :rspec, :view_specs => false
    end   
  end
end 

私はすでに --full と --mountable の両方のエンジンを作成しており、いくつかの素晴らしい記事 (以下を参照) を読んでいる人のために最終的に機能する rspec を持っていますが、私が作成しようとしているソリューションに対してこれを行うことのより広い影響について疑問に思いました

私はまだこれで遊んでおり、調査結果を投稿します..
ヘルプ/ディスカッションは大歓迎です。

ご注意ください

  1. なぜ私はそれをやりたいのか - 一度ビルドして何度も使用する...
  2. 非技術者/クライアントが「プラグイン/エンジン」を追加することは決して望んでいません-これは純粋にポイント1を楽しませるためです.

私が抱えている問題...

  1. 最上位アプリでサーバーを実行します。エンジンからコンテンツにアクセスする場合のみ (エラー メッセージで確認できます) ルーティングに問題があります (root_path が定義されていないか、ルートが見つからない) - 親アプリケーションのレイアウトがレンダリングされています。抽出されたエラーのソースで確認できます。 . 進行中ですが、葉巻はまだありません!

参考文献

4

2 に答える 2

2

次の手順でこれを機能させることができました。

  1. 私の親アプリでは、エンジンをroutes.rbにマウントしていました

    mount PluginName::Engine => '/plugin_name'
    

    私はちょうどそれを削除しました。

  2. 以下のRyan Biggが述べたように、アプリケーションコントローラーを作成しました。

    class PluginName::ApplicationController < ApplicationController
      ...
    end
    
  3. コントローラー、モデル、テストを生成するときに名前isolate_namespace PluginName空間を配置したかったので、親アプリで宝石を実行したいときは、基本的に lib\plugin_name\engine.rb をコメントアウトする必要があります。

    それはまだ理想的な解決策ではありません。頭から離れて、次のようなものを使用できます。

    isolate_namespace PluginName if %w[development testing].include?(Rails.env)
    

    しかし、これが実用的かどうかをテストする必要があります。

私が道を見つけるのを手伝ってくれたライアンに感謝します。

さらに、 --mountable スイッチ バージョンでも同じことができます。必要なのは、エンジンの config/routes.rb 置換でさらに 1 ステップ実行するだけです。

PluginName::Engine.routes.draw do

Rails.application.routes.draw do
于 2011-10-13T00:55:04.657 に答える
1

はい、通常のようにアプリケーションで参照するだけで、親アプリケーションのアセットを参照できます。

  <%= stylesheet_link_tag "application %>

ただし、なぜそれをしたいのかはわかりません...

2 番目の質問への回答で、最初の質問にお答えします。

アプリケーションのレイアウトを使用するにはApplicationController、(名前空間化されている) エンジンで を変更し、エンジンで継承する必要がありますApplicationController

これにより、エンジンによって提供されるレイアウトを使用して、エンジンのコントローラーが作成されます。私は自分のエンジンでこれをやっています、 forem

いつの日か、この記事の執筆時点で執筆中のエンジン ガイドでこれが取り上げられる予定です。

于 2011-10-12T00:08:07.360 に答える