13

補助ソースから外部データをロードする必要があるモデルがあります。モデルがデータをフェッチできる(スワップ可能な)Webサービスは多数存在しますが、サービスの変更を困難にするコードを作成したくありません(コストは可変使用量と固定使用量によって大幅に異なり、変更される可能性があります)必要になります)。

インタラクションを実行するためのドライバーを作成したいと思います(サービスの切り替えが必要な場合は、さらにカスタムドライバーを作成します)。残念ながら、ドライバーとモデルは緊密に結合されているため、コードをプラグインまたはgemに抽出することは意味がありません。すべてのコードをモジュールに抽出し(例を参照)、現在、モデルの上でコードを宣言しています。

module Synchronize
  def refresh
    self.attributes = ...
    self.save
  end
end

class Data < ActiveRecord::Base
  include Synchronize
end

Rails(3.0.0)には、モデルと緊密に結合されたモジュールを格納するための規則がありますか?これを行うためにプラグインを使用する必要がありますか?これは「app/helpers」ディレクトリに関連付けられていますか?そうでない場合、コードを保存するのに最も適切な場所はどこですか?ありがとう!

4

2 に答える 2

27

モジュールがその特定のモデルに緊密に結合されている場合、それはgem/プラグインの適切な候補ではないというのは正しいことです。

app / helpers /はビューヘルパーメソッド用であり、モデルに混合するためだけのモジュールを含めることはできません。

モジュールを配置できる場所の1つは、lib/内です。これは、app /内のどこにも実際には収まらないコード用であり、プラグインに移動する前の緩く結合されたコードの最初のホームであることがよくあります(ただし、これは厳格なルールではありません)。ただし、モジュールはモデルに緊密に結合されているため、lib/は最適な場所ではない可能性があります。

37signals(およびその他)は、関連するモデルコードをモジュールに整理する方法として「懸念事項」の概念を使用していることを知っています。これは、app /cerns /を作成し、そこにモジュールを配置することで実装されます。次に、そのディレクトリがconfig / application.rb(Rails2の場合はconfig/ environment.rb)のアプリのロードパスに次のように追加されます。

config.load_paths += %W(#{Rails.root}/app/concerns)

その後、モジュールを通常どおりモデルにミックスできます。

これは、ジェイミス・バックによるこれに関する元のブログ投稿です-http ://weblog.jamisbuck.org/2007/1/17/concerns-in-activerecord

私が個人的に好むこの別のバリエーションは、モジュールを含みませんが、このプラグインを使用します:http: //github.com/jakehow/concerned_with

お役に立てば幸いです。

于 2010-09-28T10:06:50.027 に答える
2

このリンクは私がこれを回避するのに役立ちました。

http://ander.heroku.com/2010/12/14/concerns-in-rails-3/

私はそれをmodel/extensionsディレクトリに貼り付けています。懸念ディレクトリは理にかなっていますが、「懸念」という言葉は私には明白ではありません。多分それは私に成長するでしょう。

また、application.rbに拡張パスを追加しました

config.autoload_paths += %W(#{config.root}/app/models/extensions)
于 2011-11-04T03:19:37.707 に答える