Rails 控制器与视图之间共享不超过两个实例变量

liuminhan · 2018年01月12日 · 最后由 imwildcat 回复于 2018年03月09日 · 889 次阅读

rails 风格指南里说控制器与视图之间共享不超过两个实例变量, 主要是因为什么原因会建议不超过两个实例变量?

参考这篇文章,一个原因是实例变量在before_filter这样的方法里, 会被设置与修改, 如果忘记了before_fitler做的一些操作, 这样在action中的实例变量的值可能跟预期不一样,对debug之类的产生干扰,这个不知道是不是主要原因?

共收到 8 条回复

表示项目大了很难共享不超过两个实例变量吧

如果没有详细的评测,很难说两个很大的对象会比多个小的对象更好。

Rails 的一个 controller action 为整个页面提供数据,因此很多页面都不止一个实例变量。

比如:

  1. 一个 index 页面,有几个筛选的下拉框
  2. 一个 show 页面,也有几个下拉框,比如关联属性的取值范围

这些都是很正常的需求。你当然可以把主要资源之外的数据全放在一起,比如 hash ,但这只是为了强行满足所谓的规范,没多大实际意义。为多个资源合理的命名更有利于维护。

多了不好控制。实例变量,谁想改都能改,不好控制。

有的时候,不应该放实例变量的,也被放进去了,应该避免这种情况。

反倒是觉得项目简单,多一两个还好。项目复杂了,能遵守,尽量遵守。

一种推荐,当你需要两个以上实例变量的时候需要考虑下他的必要性,这条建议的可能道理是:很多时候,实例变量的赋值牵扯到数据库查询,而过多的数据库查询会降低页面的处理速度,所以不建议在一个请求的响应中做太多的查询。

当然,随着项目膨胀和需求复杂,很多时候这条原则不好遵守,那么写代码的时候多一个心,想想查询的必要性就好了

controller 和 view间共享的变量已经很多且大了,不在乎多那么一两个。

更多的是实例变量太多引入的复杂性考虑,

所以我觉得更应该从架构层面考虑怎么把 action(view)的职能单一化。

nouse 回复

存在“两个很大的对象会比多个小的对象更好”这种情况吗?

含有 SQL 查询的 helper method 写在 views 里是不是一个解决方法,或者是很坏的实践?

liuminhan 关闭了讨论 05月31日 14:49
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册