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


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

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


1171
2017-08-13 14:33


起源



答案:


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

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

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

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

事实上,作为一个例子, will_paginate 做这样的事情:一个分页的项目集合不是简单地表示为数组,而是作为一个数组 WillPaginate::Collection 对象,它响应诸如的方法 current_pagetotal_pagestotal_entries这比使用单独的变量更自然,因为它更准确地映射了您有兴趣与视图共享的信息之间的关系。

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

底线:了解这些规则背后的理念,您将知道该怎么做。


16
2017-08-13 15:12



+1,同意:一般规则不能统治一切具体。他们就在这里让你三思而后行。 - apneadiving
非常好的答案与想法如何分组项目。我也很想得到一个答案,为什么用四个键传递哈希值比四个变量更好?写(at)类[:key1],(at)category [:key2]比(at)key1,(at)key2,(at)key3更努力 - mbdev
因为它为您提供了更好的信息模型。通过将变量组合在一起,您可以模拟彼此之间的关系。只有三个变量,效果很小,几乎没有意义,但是如果你有数百个变量,那就很重要了,这就是这些一般设计原则的来源。如果您定义新类而不仅仅是哈希值,或者您为模型方法交换控制器变量,那么您还可以提高代码的可重用性,在这种情况下,收益更加明显。 - M. Cypher


答案:


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

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

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

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

事实上,作为一个例子, will_paginate 做这样的事情:一个分页的项目集合不是简单地表示为数组,而是作为一个数组 WillPaginate::Collection 对象,它响应诸如的方法 current_pagetotal_pagestotal_entries这比使用单独的变量更自然,因为它更准确地映射了您有兴趣与视图共享的信息之间的关系。

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

底线:了解这些规则背后的理念,您将知道该怎么做。


16
2017-08-13 15:12



+1,同意:一般规则不能统治一切具体。他们就在这里让你三思而后行。 - apneadiving
非常好的答案与想法如何分组项目。我也很想得到一个答案,为什么用四个键传递哈希值比四个变量更好?写(at)类[:key1],(at)category [:key2]比(at)key1,(at)key2,(at)key3更努力 - mbdev
因为它为您提供了更好的信息模型。通过将变量组合在一起,您可以模拟彼此之间的关系。只有三个变量,效果很小,几乎没有意义,但是如果你有数百个变量,那就很重要了,这就是这些一般设计原则的来源。如果您定义新类而不仅仅是哈希值,或者您为模型方法交换控制器变量,那么您还可以提高代码的可重用性,在这种情况下,收益更加明显。 - M. Cypher