質問

あまりにもそのレール(来に仕上がってしまいました一般的に落ち着き、楽しいRubyれるOO.ただ、この傾向に大きなActiveRecordのサブクラスでは、膨大なコントローラになっているのは当然のものだけを使用コントローラー当たりの資源).した場合をより深いオブジェクトの世界では、いまのクラスやモジュールだと思)?私はいつ見解を助けますか?), コントローラおよびモデルです。

Libは大丈夫がその場で発音を確認することが ソフトウェア技術者を得て更新、機器の環境, もとは、どのような場合があると良いこと。私は学ぶ者の授業の成長が大きすぎます。また、約エンジンいていますか?

役に立ちましたか?

解決

Rails は MVC の観点から構造を提供するため、最終的には を使用することになるのは自然なことです。 のみ 提供されるモデル、ビュー、およびコントローラーのコンテナー。初心者 (および一部の中級プログラマー) にとっての典型的な慣用句は、アプリ内のすべてのロジックをモデル (データベース クラス)、コントローラー、またはビューに詰め込むことです。

ある時点で、誰かが「太いモデル、細いコントローラー」パラダイムを指摘すると、中級開発者は急いでコントローラーからすべてを切り取ってモデルに放り込み、それがアプリケーション ロジックの新しいゴミ箱になり始めます。

実際、スキニー コントローラーは良いアイデアですが、当然のことながら、すべてをモデルに組み込むことは、実際には最良の計画ではありません。

Ruby には、よりモジュール化するための優れたオプションがいくつかあります。かなり一般的な答えは、モジュール (通常は lib) メソッドのグループを保持し、モジュールを適切なクラスに含めます。これは、複数のクラスで再利用したい機能のカテゴリがあるものの、その機能がまだ概念的にはクラスに関連付けられている場合に役立ちます。

モジュールをクラスに組み込むと、メソッドはクラスのインスタンス メソッドになるため、最終的には、 トン メソッドの多くは、複数のファイルにうまくまとめられています。

この解決策は場合によってはうまく機能しますが、コード内で次のクラスを使用することを検討する必要がある場合もあります。 ない モデル、ビュー、またはコントローラー。

これについて考える良い方法は、「単一責任の原則」です。これは、クラスは 1 つの (または少数の) 物事に対して責任を負うべきだというものです。モデルは、アプリケーションからデータベースにデータを永続化する役割を果たします。コントローラーはリクエストを受信し、実行可能な応答を返す責任があります。

これらの枠にうまく収まらない概念 (永続性、リクエスト/レスポンス管理) がある場合は、おそらく するだろう 問題のアイデアをモデル化します。次のようにすることで、非モデル クラスを app/classes またはその他の場所に保存し、そのディレクトリをロード パスに追加できます。

config.load_paths << File.join(Rails.root, "app", "classes")

パッセンジャーまたは JRuby を使用している場合は、おそらく、自分のパスを Eager Load パスに追加する必要があるでしょう。

config.eager_load_paths << File.join(Rails.root, "app", "classes")

肝心なのは、Rails でこのような疑問を抱く点に到達したら、Ruby の知識を強化して、Rails がデフォルトで提供する MVC クラスだけではないクラスのモデリングを開始する時期だということです。

アップデート: この回答は Rails 2.x 以降に適用されます。

他のヒント

アップデート:Concerns の使用は、 Rails 4 の新しいデフォルトとして確認されました.

それは実際にはモジュール自体の性質に依存します。私は通常、コントローラー/モデル拡張機能をアプリ内の /concerns フォルダーに配置します。

# concerns/authentication.rb
module Authentication
  ...
end    

# controllers/application_controller.rb
class ApplicationController
  include Authentication
end



# concerns/configurable.rb
module Configurable
  ...
end    

class Model 
  include Indexable
end 

# controllers/foo_controller.rb
class FooController < ApplicationController
  include Indexable
end

# controllers/bar_controller.rb
class BarController < ApplicationController
  include Indexable
end

/lib は、汎用ライブラリとしては私の好みの選択です。私は常に lib にプロジェクト名前空間を持ち、そこにすべてのアプリケーション固有のライブラリを置きます。

/lib/myapp.rb
module MyApp
  VERSION = ...
end

/lib/myapp/CacheKey.rb
/lib/myapp/somecustomlib.rb

Ruby/Rails のコア拡張は通常、構成初期化子で行われるため、ライブラリは Rails ブースストラップに 1 回だけロードされます。

/config/initializer/config.rb
/config/initializer/core_ext/string.rb
/config/initializer/core_ext/array.rb

再利用可能なコードフラグメントについては、他のプロジェクトで再利用できるように (マイクロ) プラグインを作成することがよくあります。

ヘルパー ファイルには通常、ヘルパー メソッドが含まれますが、オブジェクトがヘルパー (フォーム ビルダーなど) によって使用されることを目的としている場合にはクラスが含まれることもあります。

これは本当に一般的な概要です。さらにカスタマイズされた提案が必要な場合は、具体的な例についてさらに詳しく説明してください。:)

...この傾向に大きな ActiveRecordのサブクラスで、大きな コントローラーはなかなか自然の---

"巨大"が気にな言葉...;-)

どのようコントローラになって巨大な?それはそれで大きくしておくとよいでしょう:理想的には、コントローラーすべきです。ピルの親指を産み出している場合は定期的に以上、5、6とコード/コントローラー方式(テーションをコントローラーかを表示します。が重複が入居のためのヘルパー関数またはフィルター?あるビジネスロジックが押し下げる。

どのようなモデルを取得し大きな?きみを削減する方法についての責任。ここにしかないものがありま行動で抽出でき込mixins?又は地域の機能ときに処理を移譲するヘルパーク?

編集:させようとする試みが行われているビット思い歪曲的な要素がひどく...

ヘルパー:住 app/helpers 主用意見より簡単になります。彼らはコントローラの特定にも利用できることができます。るコントローラは一般的に利用可能(module ApplicationHelper にapplication_helper.rb).

フィルタ:と言いますが同じラインのコードを数行為(ここでは、検索を使って、オブジェクト params[:id] んできている。その複製でき抽出した最初の別の方法としての行動の全ての宣言にフィルターのクラス定義など before_filter :get_object.第6 ActionControllerレールガイド ようにコミできます。

リファクタリングモデルはオーストラリア国内は宗教というもの。弟子 ボブおじさん と、例えば、での五カ条の 固体.ジョエル&Jeff 勧告することができる より,er,"実践的"アプローチがなされ、 もう少し調整 後退した。見かけること以上の方法以内に対する操作を行うクラスを明確に定義のサブセットの属性は、そのための方法の一つでみを特定の授業れを整理してActiveRecord由来のモデルです。

レールモデルにおいてサブクラスのActiveRecord::ベースにあります。は言い方を変えれば、モデルになるとアナログテーブルにも関係にも格納されます。でも、どんな名前のファイルに app/models によるレール'条約(コ#アンダースコアのクラス名かレールのみ)、レールを見な requiresが必要です。

ここで「薄いコントローラ」哲学から生じているように見える脂肪モデルをリファクタリングに関する優れたブログ記事です。

のhttp:/ /blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/する

基本的なメッセージではなく、利用サービスクラス「脂肪のモデルからミックスインを解凍しないでください」で、著者はこれを行うに7つのパターンを提供します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top