0

私は自分のプロジェクトのバックエンドとして MongoDB を使用していますが、後で変更することを決定した場合や、データベースなしで単体テストが簡単になる場合に備えて、プロジェクトの存続期間中は特に Mongo に依存する必要はありません。ただし、書かれているように、私のコントローラーは厳密に MongoDB に依存しています。

主にMongoDB チュートリアルから取得したもので、ファイルに次のものがありconfig/initializers/mongo.rbます。

MongoMapper.connection = Mongo::Connection.new('localhost')
MongoMapper.database = 'database'

if defined?(PhusionPassenger)
   PhusionPassenger.on_event(:starting_worker_process) do |forked|
     MongoMapper.connection.connect if forked
   end
end

米国の州を照会するためのコントローラーには、次のコードがあります。

class StateController < ApplicationController
    def index
        states = MongoMapper.connection.db('database').collection('state').find()

        render :json => states
    end
end

すぐにわかる問題がいくつかあります (おそらくもっとあるでしょう)。

  1. 前述のように、コントローラーは MongoDB に強く依存しています。
  2. 私はdatabaseMongoMapper クラスのプロパティを使用していません (コントローラーにハードコーディングされています)。
  3. 状態のコレクションへの参照が必要になるたびに、必ずしも HTTP エンドポイントを経由したいとは限りませんが、このオプションを利用できるようにしておきたいと思います。たとえば、サインアップ ページにユーザーが自宅の状態を選択するためのドロップダウン リストがある場合、クライアント側の jQuery.get() で状態のリストを入力する必要があるのはばかげているように思えます。サーバー側で状態をプリフェッチし、サーバー上にドロップダウンリストを作成する方が理にかなっているように思えます。

#3 については、状態のリストを必要とするビューをレンダリングし、それらを @states (または類似のもの) に保存する任意のアクション メソッドで状態をクエリすることはできますが、これは多くの重複コードになります。

カップリングを減らし、コードの再利用を増やすためにこれを設計する最良の方法は何でしょうか?

4

1 に答える 1

1

まず、状態のモデルが必要です。

class State
  include MongoMapper::Document
end

次に、コントローラーで、それを介してアクセスする必要があります。

class StatesController < ApplicationController
  def index
    render :json => State.all
  end
end

このようにして、コントローラーは、使用している基になるデータストアを認識しません。

最後に、HTTP 呼び出しを行う必要性を減らすために、これを JavaScript で構築すると仮定すると、次のようにコーディングします。

<div id="#states" data-states="<%= @states.to_json %>"></div>

次に、それをロードします$("#states").data("states")

于 2012-06-12T01:00:50.700 に答える