在Rails上使用模型进行特定操作?

时间:2012-10-30 22:56:01

标签: ruby-on-rails ruby controller models

我对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!

我不应该这样做,因为我在模型上有业务逻辑,理论上它是不允许的(据我所知)。但这是完成这类任务的最简单方法。

我的问题是,这是正确的方法吗? 有更好的方法吗? 谢谢!

1 个答案:

答案 0 :(得分: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

控制器告诉模型要做什么,但模型会这样做。