在控制器和视图之间仅传递两个变量 - 最佳实践?

mbd*_*dev 11 ruby-on-rails

找到了这个最佳实践,甚至在RubyMine中进行了检查:"每个控制器和视图之间只共享一个或两个实例变量." (Ruby on Rails代码质量检查表)

例如,建议的方法是什么 - 传递两个数组及其在控制器中计算的总值,这会产生4个实例变量?或者传递给Javascript数据表:数据,总项目,显示的总项目?

M. *_*her 16

我认为最明智的方法是从许多简单的对象转到很少的复杂对象.

比方说,现在你有三个独立的变量:

  1. 数据数组
  2. 总数据项
  3. 显示的总项目

现在,不是使用3个单独的实例变量(一个Array,两个Fixnum),而是创建一个Hash包含所有这三个变量的变量,或者可能定义一个新的类来响应total_items您可以在视图中调用的方法.

事实上,作为一个例子,will_paginate确实是这样的:项的集合分页不是简单地表示为一个数组,但作为一个WillPaginate::Collection对象,它响应的方法,例如current_page,total_pages,total_entries等等,这是比具有独立的变量更自然,因为它可以更准确地将您感兴趣的信息与您的视图之间的关系进行映射.

根据经验,我建议任何与密切相关的信息相对应的东西应该总是在一个实例变量中,但是由于这些最佳实践,任何根本不相关的东西都不应该"强制"成一个变量.每个规则都有一个例外,因此,例如,如果您在视图中确实有5个不同的组件彼此完全无关(很少见),盲目遵循最佳实践可能不是最好的主意.

底线:了解这些规则背后的想法,你会知道该怎么做.

  • 因为它为您提供了更好的信息模型.通过将变量组合在一起,您可以模拟彼此之间的关系.只有三个变量,效果很小,几乎没有意义,但是如果你有数百个变量,那就很重要了,这就是这些一般设计原则的来源.如果您定义新类而不仅仅是哈希,或者您为模型方法交换控制器变量,那么您还可以提高代码的可重用性,在这种情况下,收益更加明显. (2认同)