所以我处在一种情况,我必须决定是否为特定的代码片段设置单独的控制器。我们有一个主页,就像网站其余部分的中心一样。所有用户都可以访问该页面(登录以及未登录)。我在考虑将home
作为单独的控制器和一个名为index
的操作。考虑到这种情况,我开始想知道这方面是否有任何规则或指导方针。
我的看法是,如果代码围绕一个实体,则需要分离。 (类似于REST指南)如果实体是名词,它应该是一个控制器。如果实体是动词,它应该是一个动作,并且应该驻留在控制器中,该控制器的名称与动词所引用的名词的名称相同。一些同事建议,因为这是一个动作,它应该驻留在一些现有的控制器中,并且应该命名为home
。我强烈反对,但是,我找不到一个值得信赖的消息来支持我。
想知道你的想法。
答案 0 :(得分:1)
在这种情况下,我必须同意你的同事。
正如你所说,在处理资源时,REST是一种很好的方法。这允许您创建一致的界面,尤其是创建Web服务的视图。然而,REST实际上并没有很好地映射到Web浏览器设置。您会注意到,例如即使对于资源,您的/ edit和/ new操作只是GET请求,返回指向相关RESTful操作的HTML表单。 'edit'和'new'根本不是RESTy。
类似地,主页通常是各种数据的用户友好合并,不适合RESTful接口。所以要么只是在一个动作中添加一个额外的控制器,要么使用现有控制器的'list'动作作为主页
答案 1 :(得分:0)
问题始于短语
如果实体是动词
如果您尝试生成RESTful架构,则实体不能是动词。如果您使用HTTP,则允许的唯一动词是GET,PUT,POST,DELETE,HEAD,OPTIONS。所有实体都应映射到某个名词,如果您要检索该实体,则应使用动词GET。就个人而言,我会将其映射到我的控制器上的方法Get(),但我不知道Rails是否允许你这样做。
答案 2 :(得分:0)
快速(无益)答案是两种方式都可以。
我认为每个人都会在某个时刻遇到这个决定,而你做出的决定取决于网站的可能未来......这意味着它很容易过早优化......但这总是有利可图,
正如你现在可能已经猜到的那样,“家”在某种程度上既是一个动词,也是一个名词,这就是为什么你在找出要做什么时遇到的麻烦。
答案取决于对您网站结构的解释和可用时间的组合......
如果您没有多少时间来处理这个问题......那么将“主页”操作填充到另一个控制器中通常被认为是权宜之计。它可以工作,它可以让你转移到其他(可能更高效)的任务上。
然而,我同意有时候退一步思考你正在做什么以及是否可以做得更好...... 在这种情况下,尽管定义“更好”更难 - 因为将主动作置于新控制器中的可能性会大大加快......如果它是控制器中的唯一动作......那么它是否更好是值得商榷的,在架构上,只需将其添加到现有控制器上......
因此,我们开始讨论的主要是哲学辩论......换句话说,没有答案比其他答案“更正确” - 更多的是品味和环境问题。在这种情况下,辩论取决于使结构更加RESTful。
为了忠实于RESTful架构,您确实会将操作移动到它自己的控制器中......但您首先必须确定实体是什么。 “主页”页面通常不易识别为特定的数据库实体......它通常是门户页面。
有时您可以选择实体,例如,在线商店通常会有一个实际上是“产品#index”变体的主页,或者有时“主页”页面是UserAccount#show page ...但更常见的是,主页不简单,并将结合来自多个实体的信息...因此很难确定“正确”的架构将是什么。
如果您无法识别特定实体,那么是否将操作移动到特定控制器方面存在一个有效的争论。
但是,您始终可以创建一个以网站架构为中心的新“实体”。如果您打算为网站提供其他非实体特定页面(例如T& Cs或“关于我们公司”页面),这种情况尤其可能。
通常的回退是“PageController”(或类似的名称),它没有链接到Active Record 模型,而是链接到一个更模糊的实体,在这种情况下是一个“页面”,它是可识别网站的用户(例如“主页”和“T& C页”和“关于页面”)。每个操作都针对特定页面......
因此,由您对系统架构的看法是否更合适......以及是否值得努力......这取决于您,但这是我对辩论的看法。 :)