何时在rails中创建新控制器

时间:2011-11-08 11:42:48

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我想知道你什么时候需要在rails应用程序中创建一个控制器。

例如,我正在阅读使用Rails的Agile Web Development中的教程,该应用程序创建了几个模型,所有模型都具有单独的视图和控制器。但是,我们还会创建一个Store控制器,但没有与之关联的模型。为什么我们需要一个没有型号的控制器?模型的控制器难道无法处理所有必需的操作吗?

这是常见的吗?如果是这样,你如何确定何时需要控制器?

谢谢!


这些答案有帮助,谢谢。

我担心的是,当我自己开发一些东西时,我会开始创建无用的控制器,或者另一方面,不会创建必要的控制器。但是,我想我需要停止将控制器和模型视为1-1关系,对吗?如果我理解正确,可能有许多控制器访问模型,并且在一个控制器中使用了许多模型?

4 个答案:

答案 0 :(得分:32)

更新:我强烈建议您阅读How DHH Organizes His Rails Controllers ,这比我原来的答案要好得多。


如果你换一种方式,我认为这个问题会更合适:

为什么我们需要每个控制器的模型(在这种情况下为AR)?

答案当然是,你没有。当您考虑控制器时,最好不要考虑数据,而是稍稍退一步,并考虑资源。如果您在互联网上搜索REST,您会发现很多文章,其中大部分将包含术语资源表示的各种解释。为了简化这个故事,让我们过分简化并说 resource 是值得一提的一切。文章是(收集)资源。商店是(单一的,成员)资源。

以签名用户为例。您可能已经拥有UsersController(默认情况下)将允许您添加新用户(创建资源),删除它们(删除资源),显示单个用户以及所有用户。如果您只考虑数据和控制器,您可能会开始在UserController中创建其他操作,如login_user,这是一种气味。如果您考虑资源,那就是“值得一提或为其创建URI的所有内容”,您可能认为需要其他资源,即: sessions 。想一想:当用户登录时,他实际上创建会话资源。退出后,您删除删除资源。我推荐的 Rails教程一书中提到了更好的解释:http://ruby.railstutorial.org/chapters/sign-in-sign-out#sec:sessions

总结一下,这可以帮助您找出何时需要新的控制器:

  • 当您考虑将非REST动作置于log_incalculate_date等控制器中时,等等。
  • 当有某些东西你可以命名并且“有趣”足以成为一个单独的资源时。
  • 此外,当你以“外在”的方式发展时,这样的答案会更自然地得到:http://rubylearning.com/blog/2010/10/05/outside-in-development/
总的来说,了解REST及其理念将会有很大帮助。

答案 1 :(得分:8)

显然,没有硬性规则;但我认为从MVC的三个不同部分代表(或“做”)的角度来思考是有帮助的:

  • 模型代表数据和数据逻辑后端
  • 控制器让用户与模型互动
  • 观看次数是用户通过控制器进行互动时看到的内容

当您想要做不同的(事物的类别)时,会使用不同的控制器。

例如,在AWD书中,Depot应用程序(广泛地)通过操作和存储产品来工作 - 因此它具有产品模型。

有两种不同的互动方式;作为仓库的所有者(添加产品,调整价格和库存......)或作为客户(将产品添加到购物车,结帐......)。所以它有前者的Admin控制器和后者的Store控制器。

另一个原因是,如果您的控制器需要不同的包装,那么通常与第一个原因相关的原因。例如,您需要在执行任何管理员工作之前对用户进行身份验证,但是您不需要基于客户的事情。因此,您可以将操作分成两个控制器,并在Admin 1上放置一个before_filter来处理身份验证。

答案 2 :(得分:1)

我也是RoR的新手,我正在做Michael Hartl的教程。我在研究中发现并与经验丰富的Rubyist交谈,当你需要Model(数据库)的帮助时,你应该创建一个Controller。例如,如果您正在创建会话,并且您正在创建的方法需要通过使用,存储,更新,添加(a.k.a. RESTful行为)来与Model(数据库)进行交互,那么您将需要一个控制器。

为什么呢?如前所述:MVC框架工作要求控制器是唯一可以与模型交互的元素(有点像一个充满热辣女性的夜总会VIP区的保镖!极客用“视图”LOL代表! !)!!

答案 3 :(得分:0)

控制器可用于创建与模型没有边界的页面。一个例子可能是法律通知或某事。像那样。静电东西,......

Controller控制数据。在大多数情况下,这些数据来自Model,但这不是最常见的组合。