web-dev-qa-db-ja.com

Railsアプリがどこにも適合しない場所に配置する場所に関するガイドライン

非標準のRubyファイルをRailsアプリ、どこにも当てはまらないアプリ)に配置する場所に関するベストプラクティスがあるかどうか疑問に思っていますデフォルトのディレクトリ(controllers/modelsなど)。

コントローラ/モデルなどで使用されているが、Rails基本クラスのいずれのサブクラスでもないクラスについて話しています。モデルから抽出された機能を組み込んで、脂肪を少なくするクラスです。それらのいくつかは一種のモデルのように見えますが、ARモデルではありません。それらのいくつかはより「サービス」のように見えます。いくつかはその中間または何か他のものです。

いくつかのランダムな例:

  • Facebookなどを介して、パスワードによる認証を処理する「戦略」クラス.
  • paramsをカプセル化する「XParams」オブジェクト、またはparamsの処理を処理して最終的にいくつかのARモデルを作成するいくつかの複雑なアクションを実行する「XCreator」オブジェクト
  • 外部APIへの要求を行うか、それらの要求と応答をカプセル化するクラス
  • 実際のARモデル(ゲストユーザーなど)の代わりに使用できる偽のモデル
  • Resqueジョブ
  • redisからの情報を保存および読み取るクラス
  • データの処理、レポートの生成などの特定のアクションを実行し、ResqueジョブまたはRakeタスクから呼び出されるクラス

私はこれらの多くを手に入れました。それらのいくつかはlibに追加され、ランダムなクラスとモジュールの山となってしまい、一部はapp/modelsに忍び込みます。どういうわけか整理したいのですが、どこから始めたらいいのか分かりません。

ARモデルのみをapp/modelsに入れますか?または、ドメインやヘルパーモデルをそこに配置しても問題ありませんか?モデルかどうかをどのように判断しますか?

appに収まらないものはすべてlibに入りますか?それとも、いくつかの新しいカスタムサブディレクトリをappに追加する必要がありますか?どのサブディレクトリ、およびカスタムクラスを分割するにはどうすればよいですか?

プロジェクトでこれをどのように処理しますか?すべてのプロジェクトが少し異なることは知っていますが、いくつかの類似点があるはずです。

42
Kuba Suder

良い質問です-具体的な答えはありません

しかし、私はこの投稿をチェックすることをお勧めします- http://blog.codeclimate.com/blog/2012/02/07/what-c​​ode-goes-in-the-lib-directory/ -必ずすべてのコメントを読む

現在のプロジェクトでは、app/modelsの下に非ActiveRecordオブジェクトがたくさんありますが、それは機能しますが、「再利用可能な」非アプリケーション固有のコードをlibの下に置きます

私がサイドプロジェクトで試した他の代替案(たとえば、コマンドオブジェクトがたくさんあるとします)Railsは、アプリの名前空間に関しては、デフォルトですべてを同じ名前空間にロードします)

app/
  commands/
    products/create_command.rb         # Products::CreateCommand
    products/update_price_command.rb   # Products::UpdatePriceCommand

代わりに、Rails以外のすべてがsrcまたはapp_nameディレクトリの下に

app/
  src/
    commands/
      create_product.rb         # Commands::CreateProduct
      update_product_price.rb   # Commands::UpdateProductPrice

私はこれに対する良い解決策を見つけていません、理想的には2番目の解決策が優れていますが、追加のディレクトリをアプリの下に置かずに、アプリを開いてコントローラー、コマンド、モデルなどを表示するといいでしょう...

15
house9

さまざまなユースケースに触れますが、この部分が「正しい」答えに最も近いと思います。

私はこれらの多くを今持っています、それらのいくつかはlibに追加され、ランダムなクラスとモジュールの山として終わり、いくつかはapp/modelsに忍び込みます。どういうわけか整理したいのですが、どこから始めたらいいのか分かりません。

それは私の本ではかなり正しいです。言及しないことの1つは、さまざまな部分を別々の宝石に抽出することです。外部サービスと対話するクラスは、十分に一般的である場合の戦略クラスと同様に、抽出の優れた候補です。独自のgemサーバーを実行することは難しくないため、これらはプライベートにすることができ、RORアプリ間で明らかに再利用できます。

最後に、そして最も具体的には、私がlib/jobsに入れるジョブをrequeします。

私の経験則は、それがモデルである場合ある種のである場合、それはapp/models。そうでない場合は、おそらくlibまたは適切な名前のサブディレクトリに属しています。 lib/jobslib/extensionslib/externalなど。

9
Dave S.

あなたが興味を持っているなら、私はこれについて私が見つけたものを少し後でまとめたフォローアップ記事も書きました: http://blog.lunarlogic.io/2013/declutter-lib-directory/

3
Kuba Suder

モデルクラス(STIサブクラスなど)をapps/modelsに配置します。他のクラスはlibに配置します。これは、それらを配置するのに最適な場所のようです。どこを見ればいいのか簡単にわかります。モデルクラスがすべて1か所にあるため、テストをグループ化するのも簡単です。

慣習的には、ヘルパークラスをapp/modelsに入れるのは嫌です。それらがプレゼンタークラスである場合、それらはapp/helpersに属します。そうでない場合は、libが最適です。

3
Richard Brown

多くの場合、私のクラスは、サブディレクトリと同じ名前のモジュールがそれらを含める責任を負うサブディレクトリのlibに移動します。 (Railsは、オートローダーに関しては、ファイル名とクラス名について非常に扱いにくいです。)

別のオプションは、各モジュールを独自のgemにカプセル化し、Gemfileを介してgemを参照することです。これにより、プロジェクト間でコードを共有できます。

1
cfeduke