0

私は RoR についてかなりの初心者であり、ビジネス ロジックを暗示する特定の状況のモデルなど、コントローラーやその他のものをいつ使用するかを理解するのに苦労しています。

次のように、Twitter で共有するメソッドを持つ Post モデルがあるとします。

class Post < ActiveRecord::Base
  def send_to_twitter!
    Twitter.update("#{self.title} #{self.url}")
  end
end

そして、どこかにこれがあります:

Post.find(9).send_to_twitter!

モデルにビジネスロジックがあり、理論的には許可されていないため(私が知っていることから)、これを行うことは想定されていません。しかし、これはこの種のタスクを実行する最も簡単な方法です。

私の質問は、これは正しい方法ですか?もっと良い方法はありますか? ありがとう!

4

1 に答える 1

2

ビジネス ロジックはモデルに属します。モデルはデータを保存し、そのデータに対してアクションを実行します。したがって、これは完全に正しいです。

コントローラーは、モデルとレンダリングされた出力の間の接着剤であり、ユーザー入力を処理します。コントローラーはモデルに何をすべきかを指示しますが、モデルはそれを行うべきです。

古い格言は、「痩せたコントローラー、太ったモデル」です。モデルに何をすべきかを伝えることは、それらのアクションを実行するためのコード (モデル コード) が複雑で長い場合でも、単純かつ簡単でなければなりません (コントローラー コード)。


アプリを空港のように考えてください。航空管制官はあなたの「管制官」です。彼らは、飛行機 (モデル) が他の飛行機 (他のモデル) に安全で安全であることを確認すると、着陸するように指示します。次に、飛行機に着陸するように指示しますが、飛行機は自分自身を着陸させます。

モデルは、独自のデータでタスクを実行する方法を知っている必要があります。しかし、これらのタスクをいつ実行するかを決定するのは、通常、コントローラーが行うことです。

class AirPortController
  def request_landing(plane)
    if @landing_planes.size == 0
      plane.land!
      @landing_planes << plane
    else
      plane.request_again_in(5.minutes)
    end
  end
end

コントローラーはモデルに何をすべきかを伝えますが、モデルはそれを行います。

于 2012-10-30T23:01:48.890 に答える