方法何时在模型中而不是在控制器中定义? (来自Rails教程的第10章)

时间:2012-12-27 22:40:29

标签: ruby-on-rails-3 railstutorial.org

我目前正在阅读Hartl的Rails教程,并且通过前10章左右已经习惯了将大多数动作/方法放入控制器的惯例。目前,正如本书正在进行并且defining a feed method用于Microposts,该方法与User.rb 模型一起放置。由于我对rails(以及一般编程)的世界相对较新,我想知道将这种方法(下面复制)放在模型中的原理或惯例是什么?

放置在User.rb模型中的方法:

  def feed
    # This is preliminary. See "Following users" for the full implementation.
    Micropost.where("user_id = ?", id)
  end

2 个答案:

答案 0 :(得分:2)

实际上,在哪些代码放在哪里存在争议,但总的来说,有一些简单的指导方针可供遵循。

该方法是否必须了解有关基础数据结构的一些细节?把它放在模型中。

确定这一点的一种简单方法是使用ActiveRecord方法,例如数据库中的find,where或特定列。通过在模型中保留此逻辑,这意味着如果您需要更改基础数据存储区,则只需更改模型。

该方法对页面的呈现方式有一定的说法吗?把它放在控制器中。

通常,控制器应该非常薄,将数据推送到视图并将表单数据保存回模型。

虽然(如果我没记错的话)Hartl不会考虑非rails类,不要害怕将“业务逻辑”放在rails结构之外。您可以创建一个app / lib或app / services或app / x目录,并在其中放置普通的旧ruby对象,然后可以从控制器和模型中调用它们来处理他们擅长的事情。

答案 1 :(得分:2)

旨在尽可能地将“推动”事物“推进”到模型中,然后它们将重复次数减少并且更多可用。不要只使用Active Record数据库表的模型。

您通常可以更轻松地对模型进行单元测试。

放置共享内容的另一个“下一个”位置是/lib