2010-12-30 11 views
0

Rails 3エンジン(またはプラグインや宝石)の作成を進める上で最善の方法を考えてください。この質問の長さRails 3 Engine/Plugin/Gemを作成する際にガイダンスが必要

謝罪...ここにパート1です:

私の会社は、当社のアウトバウンドの顧客の電子メールのすべてを送信する電子メールサービスプロバイダを使用しています。彼らはSOAP Webサービスを作成しました。これをサンプルRails 3アプリに組み込みました。最初にアプリケーションを作成するという目標は、そのコードを受け取り、それを宝石に変えることでした。

ここにいくつかの背景があります:SOAPサービスには23のアクションがあり、サンプルアプリケーションを作成する際に同様のアクションをグループ化しました。これらのアクションの中には、SOAP WS経由でメーリングリストとHTMLコンテンツのアップロード/ダウンロードを行うものがあります。その結果、HTMLコンテンツを格納するテーブルがいくつかあり、一種の「ステージング領域」としてリストされます。

すべて私はSOAPアクション(ではなくActiveRecord :: Baseから継承する)を含む5つのモデルと、MySQLデータベースと対話する3つのモデルを持っています。

私はそれぞれのモデルに対応するコントローラと、実装した動作をテストするのに役立つ各SOAPアクションのビューも持っています。

だからここからどこに行くのかわかりません。私のコードは大量のDRYを必要とします。例えば、WSは、ユーザ認証情報が各要求のエンベロープ本体に送られることを要求する。つまり、モデル内の各メソッドには、同じauth infoがハードコーディングされており、非常に繰り返しがあります。明らかに私はそれがきれいになるようにしたいと思います。また、コードを見直して、要求自体が繰り返しあり、おそらく統合できることを確認します。

私は自分で考え出すことができますが、ここには明らかなようなものがありますが、わかりません。私のすべてのモデルで使用できるメソッドを作成するにはどうすればよいですか(特に、方程式のユーザー認証の部分を考えて)。

はここでパート2です:

最初から私の意図は、それを使用することができ、私のコードを抽出し、私のESPの他のクライアントのいずれかの包み宝石にそれをパッケージ化することであった(プラス私は別のいくつかでそれを使用することがありますアプリ)。しかし、私はそれが非常に構成可能であることを望んでいます。 Gemfileに宝石を追加するだけでデフォルトの最小構成(つまり、のSOAPアクションをラップするモデル)が作成されている必要があります。しかし、私は、ユーザーを起動させるためにいくつかのツール(ジェネレータやRakeタスクなど)を用意することもあります。私が念頭に置いておきたいのは、マイグレーションファイル、モデル、コントローラー、またはビュー(または必要な場合は9ヤード全体)を作成するオプションです。

ここで、私がプラグインまたはエンジンルートを追いかけるべきかどうかを知っているところです。私はジョーダンウエストのシリーズを読んでエンジンを作りましたが、私はその考えが本当に好きですが、それが私にとって正しいルートかどうかはわかりません。

あなたがここまで読んで、私はあなたの地獄を混同していないのであれば、私はいくつかのガイダンスを使用することができます:)

おかげ

答えて

0

はの部品であなたの質問に答えるしてみましょう。

第一部

Rubyの柔軟性は、あなたが非常に簡単にモデルのすべての間でコードを共有できることを意味します。彼らはどんな種類のクラスを拡張していますか?その場合、単にそのように親オブジェクトにメソッドを追加:

class SOAPModel 
    def request(action, params) 
    # Request code goes in here 
    end 
end 

そして、それは単にあなたのそれぞれのモデルでrequestを呼び出す場合です。あるいは、このメソッドには、SOAPModel.requestで静的にアクセスできます。それは本当にあなた次第です。それはRubyの

[User, Post, Message, Comment, File].each do |model| 
    model.send :define_method, :request, proc { |action, params| 
    # Request code goes in here 
    } 
end 

ので、それを行う方法のトンがあります(いくつかの奇妙な理由で)あなたは親オブジェクトに触れることができない場合にはそうでない場合、あなたは動的にメソッドを定義することができます。

第二部

宝石はあなたの問題を処理する柔軟以上です。 RailsとRakeの両方がかなりスマートで、あなたの宝石の中を(あなたの環境ファイルとGemfileにある限り)見ていきます。 generatorsディレクトリと/name/name_generator.rbを作成します。の名前は、ジェネレータの名前です。ちょうどrails g nameを実行し、そこにいます。レイク(tasks)も同じです。

私はそれが助けてくれることを願っています!

+0

ありがとうございました!それはかなり役に立ちます。 –

関連する問題