非標準のRubyファイルをRailsアプリ、どこにも当てはまらないアプリ)に配置する場所に関するベストプラクティスがあるかどうか疑問に思っていますデフォルトのディレクトリ(controllers
/models
など)。
コントローラ/モデルなどで使用されているが、Rails基本クラスのいずれのサブクラスでもないクラスについて話しています。モデルから抽出された機能を組み込んで、脂肪を少なくするクラスです。それらのいくつかは一種のモデルのように見えますが、ARモデルではありません。それらのいくつかはより「サービス」のように見えます。いくつかはその中間または何か他のものです。
いくつかのランダムな例:
私はこれらの多くを手に入れました。それらのいくつかはlib
に追加され、ランダムなクラスとモジュールの山となってしまい、一部はapp/models
に忍び込みます。どういうわけか整理したいのですが、どこから始めたらいいのか分かりません。
ARモデルのみをapp/models
に入れますか?または、ドメインやヘルパーモデルをそこに配置しても問題ありませんか?モデルかどうかをどのように判断しますか?
app
に収まらないものはすべてlib
に入りますか?それとも、いくつかの新しいカスタムサブディレクトリをapp
に追加する必要がありますか?どのサブディレクトリ、およびカスタムクラスを分割するにはどうすればよいですか?
プロジェクトでこれをどのように処理しますか?すべてのプロジェクトが少し異なることは知っていますが、いくつかの類似点があるはずです。
良い質問です-具体的な答えはありません
しかし、私はこの投稿をチェックすることをお勧めします- http://blog.codeclimate.com/blog/2012/02/07/what-code-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番目の解決策が優れていますが、追加のディレクトリをアプリの下に置かずに、アプリを開いてコントローラー、コマンド、モデルなどを表示するといいでしょう...
さまざまなユースケースに触れますが、この部分が「正しい」答えに最も近いと思います。
私はこれらの多くを今持っています、それらのいくつかはlibに追加され、ランダムなクラスとモジュールの山として終わり、いくつかはapp/modelsに忍び込みます。どういうわけか整理したいのですが、どこから始めたらいいのか分かりません。
それは私の本ではかなり正しいです。言及しないことの1つは、さまざまな部分を別々の宝石に抽出することです。外部サービスと対話するクラスは、十分に一般的である場合の戦略クラスと同様に、抽出の優れた候補です。独自のgemサーバーを実行することは難しくないため、これらはプライベートにすることができ、RORアプリ間で明らかに再利用できます。
最後に、そして最も具体的には、私がlib/jobsに入れるジョブをrequeします。
私の経験則は、それがモデルである場合ある種のである場合、それはapp/models
。そうでない場合は、おそらくlib
または適切な名前のサブディレクトリに属しています。 lib/jobs
、lib/extensions
、lib/external
など。
あなたが興味を持っているなら、私はこれについて私が見つけたものを少し後でまとめたフォローアップ記事も書きました: http://blog.lunarlogic.io/2013/declutter-lib-directory/
モデルクラス(STIサブクラスなど)をapps/models
に配置します。他のクラスはlib
に配置します。これは、それらを配置するのに最適な場所のようです。どこを見ればいいのか簡単にわかります。モデルクラスがすべて1か所にあるため、テストをグループ化するのも簡単です。
慣習的には、ヘルパークラスをapp/models
に入れるのは嫌です。それらがプレゼンタークラスである場合、それらはapp/helpers
に属します。そうでない場合は、lib
が最適です。
多くの場合、私のクラスは、サブディレクトリと同じ名前のモジュールがそれらを含める責任を負うサブディレクトリのlib
に移動します。 (Railsは、オートローダーに関しては、ファイル名とクラス名について非常に扱いにくいです。)
別のオプションは、各モジュールを独自のgemにカプセル化し、Gemfileを介してgemを参照することです。これにより、プロジェクト間でコードを共有できます。