RailsはMVCの観点から構造を提供するため、提供されているモデル、ビュー、コントローラーのコンテナーのみを使用するのが自然です。初心者(および一部の中間プログラマー)の典型的なイディオムは、アプリ内のすべてのロジックをモデル(データベースクラス)、コントローラー、またはビューに詰め込むことです。
ある時点で、誰かが「ファットモデル、スキニーコントローラー」パラダイムを指摘し、中間の開発者がコントローラーからすべてを急いで切り出し、モデルに投入します。これは、アプリケーションロジックの新しいゴミ箱になり始めます。
実際、細いコントローラーは良いアイデアですが、当然のことですが、モデルにすべてを入れることは、実際には最良の計画ではありません。
Rubyでは、よりモジュール化するための優れたオプションがいくつかあります。かなり一般的な答えはlib
、メソッドのグループを保持するモジュール(通常はに隠しておく)を使用し、そのモジュールを適切なクラスに含めることです。これは、複数のクラスで再利用したい機能のカテゴリがあり、機能がまだ概念的にクラスに関連付けられている場合に役立ちます。
モジュールをクラスに含めると、メソッドはクラスのインスタンスメソッドになるので、大量のメソッドを含むクラスになりますが、それらは複数のファイルにうまく整理されています。
このソリューションは、場合によってはうまく機能します。他の場合では、モデル、ビュー、またはコントローラーではないクラスをコード内で使用することを検討する必要があります。
それを考える良い方法は、「単一責任の原則」です。これは、クラスが単一(または少数)の事柄に対して責任を持つべきであると述べています。モデルは、アプリケーションからデータベースへのデータの永続化を担当します。コントローラーは、要求を受信して実行可能な応答を返す責任があります。
これらのボックスにうまく収まらない概念(持続性、要求/応答管理)がある場合は、問題のアイデアをどのようにモデル化するかについて考えたくなるでしょう。非モデルクラスをapp / classesまたはその他の場所に保存し、次のようにしてそのディレクトリをロードパスに追加できます。
config.load_paths << File.join(Rails.root, "app", "classes")
パッセンジャーまたはJRubyを使用している場合は、パスを熱心なロードパスに追加することもできます。
config.eager_load_paths << File.join(Rails.root, "app", "classes")
要点は、いったんRailsでこの質問をするポイントに到達したら、Rubyチョップを強化し、Railsがデフォルトで提供するMVCクラスだけではないクラスのモデリングを開始するときが来たということです。
更新:この回答はRails 2.x以降に適用されます。