2012-03-29 10 views
1

私はActiveSupport :: Concernを使用していますが、これらのファイルを/ app/model/concernフォルダに整理して一般的な懸念事項を述べる方法はいくつかありますが、私はいくつかのアプローチを見ており、いくつかの長所と短所Rails 3 - モジュールまたはクラスに関する懸念

class Alert < ActiveRecord::Base 
    include Shareable 

/アプリ/モデル/アラートのフォルダに懸念

class Alert 
    module Shareable 
     extends ActiveSupport::Concern 

または

module Alert::Shareable 
    extends ActiveSupport::Concern 
01を見たいのですが、特定のモデルへの懸念

または

module Alert 
    module Shareable 
     extends ActiveSupport::Concern 

これを行うか、私は唯一のモジュールまたはクラスモジュールを使用する必要がある場合の最善の方法があるかどうか、本当にわかりません。私はそれが自明であることを知っています、そして、彼らはすべて働くようですが、組織的に最良のアプローチがあるかどうかは分かりませんでした。ありがとう!

答えて

2

お使いのモデルがAlertの場合は、module Alert(#3)は間違いありません。 #1と#2は基本的に同じですが、より頻繁に#2のスタイルが見えます。

もう少し説明しましょう。

module X::Yスタイルは、Xが既に定義されている場合にのみ機能します。 「Xの下で、このモジュールYを作成し、Xは、クラスまたはモジュールである場合、私は気にしない、ちょうどそれを行うと言っています。

#3については、Alertがすでにclassとして定義されているので、あなたはこのエラーを取得します:TypeError: Alert is not a module

あなたはより多くの明確化が必要な場合は、私に教えてください

+0

オースティン私はすべての3つを使用し見てきたポイントに得てとする方法があった場合は常に100%ではないでしてきた、ありがとうございました。。!私は今、大規模なリファクタリングをしています。私は実際に物事の内容を理解するのが大好きです。あなたの助けをもう一度感謝します! – bokor

+0

問題ありません。クラスとモジュールの両方を定数と考えるだけで意味論的に意味のあるものに合わせて入れ子にすることができます。クラスはモジュールの下に置くことができ、その逆も可能です。最終的に他のものが共有可能であることが理にかなったら、それを名前空間の先頭に移動します。意味、Alertの下にネストしないでください。乾杯。 – Austin

+0

合意しました。第2のスタイル、つまりAlert :: Shareableモジュールを使用する方が簡単でした。最初の、つまりクラスモジュールを使用すると、アラートの複数のクラス定義によってツールが混乱している場所に移動します。たとえば、Annotate gemはスーパークラスの不一致エラーを示し、Alertモデルに注釈を付けません。私はまた、devのコンソールにいくつかの問題があった。つまり、両方のスタイルは、実行中のRailsアプリケーションで正常に動作します。 – Alric

関連する問題