2016-04-13 10 views
2

My Railsアプリケーション(Rails 3と4のコンパイル)はすべて独自のデータベースを持っていますが、サードパーティのデータベースにもアクセスできます。そのため、彼らはこのサードパーティのデータベースへのモデルを持っています。私はこれらのモデルをそれぞれのアプリケーションにコピー&ペーストするのではなく、再利用できるようにDRYしたいと思います。考慮するコントローラ、ヘルパー、またはルートはありません。モデルのみ。しかし、それはRailsの "部品"を持っているので、これは私がエンジンが必要であることを示しているようです。しかし、私が使っているすべてのアプリでこれらのモデルを望むという事実は、通常のレール対応の宝石だけを必要としているように思えます。"Regular" Ruby gemまたはRailsエンジン?

宝石やRailsエンジンの方がよいでしょうか?

エンジンが優れている場合は、どこから始めるのかよく分かりません。私が読んだガイドのいくつかから、新鮮なRailsアプリケーションでエンジンを作成したようです。私はまた、fullmountableについて少し不明ですが、私は自分の名前空間でこれらのモデルを好きであることを知っています。

最後に、これらのモデルをすべてのアプリで使用できるようにしたいと考えています。エンジンは、宝石として梱包されていて、正しいですか?もしそうなら、私はただの宝石として始めることはできませんでしたが、特定のアプリの中でエンジンとして始動し、その事実の後に宝石を輸出するのではなく?

私は非常に混乱していますので、フィードバックは高く評価されます。私も以前に宝石やエンジンをつくったことがないので、このエリアの愚かさを許してください。

+0

モデル以外のものはエンジンが必要なことを示していないのはなぜですか?いずれにせよ、それは「より良い」ものであり、残りは非常に幅広いものです。 http://edgeguides.rubyonrails.org/engines.htmlのようなものから始めて、非常に具体的な質問をするのは理にかなっていますか? –

+0

@DaveNewton:申し訳ありませんが、* Railsの「パーツ」があるため、エンジンでなければなりません。 – istrasci

+0

私はそれがなぜあるのか分かりませんが、たぶん。もしそれが宝石であれば、Railsの外でも使うことができます(例えば、コマンドラインのutilなど)。 –

答えて

1

エンジンは実際には魔法のようなものではありませんが、その印象を得るのは簡単です。最も簡単な場合、「エンジン」はRails::Engineのちょうどサブクラスです。あなたのRailsアプリケーション(例えばrequire 'yourgem/engine)によってロードされるとすぐに、あなたのエンジンのメソッドが実行され、あなたのエンジンをRailsアプリケーションに接続します。エンジンの中にたくさんのパスをアプリケーションのロードパスに魔法のように追加します。あなたのエンジンのモデルとコントローラがあなたのアプリにどのようにロードされるか)。

Getting Started With Rails Enginesを読んでみたのであれば、Railsジェネレータを使用していない限り、エンジンを作成できないと思うかもしれません。しかし、それはすべてオプションです!私は個人的には、普通の宝石を作り、それをエンジンに変えることをお勧めします。これは主にちょっとだけ地球に近いAPI docsです。宝石にappフォルダを持ち、モデルやコントローラなどを保持するための推奨パターンであっても、オーバーライドすることができます(APIドキュメントのPathsセクションを参照)。

ので、のようなので、あなただけのモデルを含むようにあなたのエンジンをしたいあなたのケースで、私は宝石のレイアウトをお勧めしたい:

yourgem/ 
    app/ 
    models/ 
     yourgem/ 
     your_thing.rb 
    db/ 
    migrate/ 
     20160413010101_create_models.rb 
    lib/ 
    yourgem/ 
     engine.rb 
     version.rb 
    yourgem.rb 
    yourgem.gemspec 

あなたengine.rbはかなり単純なことができます:

# lib/yourgem/engine.rb 
module YourGem 
    class Engine < ::Rails::Engine 
    isolate_namespace YourGem # this is generally recommended 

    # no other special configuration needed. But maybe you want 
    # an initializer to be added to the app? Easy! 
    initializer 'yourgem.boot_stuff_up' do 
     YourGem.boot_something_up! 
    end 
    end 
end 

あなたのマイグレーションとモデルは正常に見えます(ただし、このエンジンを使用するアプリケーションとの競合を避けるため、モデル名は宝石名の下にある必要があります)。

希望に役立ちます!

+0

さて、あなたはもう少しエンジンについて説明しましたが、私の元の質問は未だに答えられていません。また(多分あなたが逃した)、私は移行を持っていません。モデルのみ。 – istrasci

+0

@istrasci:いずれにせよ、あなたは宝石を作る必要があります。さて、あなたのモデルはActiveRecord :: Baseのサブクラスですか、それとも普通の古いRubyオブジェクトですか?後者の場合は、すべてのエンジンを忘れてしまいます。前者の場合は、Railsへの依存性を明示的にするためにエンジンを使用することをお勧めします(イニシャライザやジェネレータなど)。 –

+0

これらはActiveRecord :: Baseのサブクラスです。だから私が既存のアプリの1つでエンジンを作ったら、どうすればこのエンジンを他のアプリが使える宝石に「コンパイル」するのですか? – istrasci

関連する問題