0

我对 RoR 很陌生,我很难弄清楚何时使用控制器或其他东西,比如用于暗示业务逻辑的特定情况的模型。

假设我有一个 Post 模型,它有一种在 Twitter 上分享它的方法,比如这个:

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 回答