Rails助手应该假设一个实例variables是否存在,或者他们是否应该接收它们作为参数?
我想知道是否有一个特定的编程原则(Demeter?)支持Rails助手不应该使用控制器实例variables的想法,相反,他们应该接受这样的variables作为函数参数。 例如,假设我的ChickensController#squawk
动作创build一个名为@egg
的实例variables。 此外,假设squawk
视图包含一个名为cockadoodledoo
的助手的调用,实现如下:
def cockadoodledoo @egg.to_s end
将@egg
作为parameter passing@egg
这个视图会调用cockadoodledoo(@egg)
并且该帮助器类似于:
def cockadoodledoo(egg) egg.to_s end
我希望你们中的一个快乐的黑客在星期五的下午已经够无聊了。 Cockadoodledoo!
这个问题是类似的,但从来没有准确的答案。
接收他们作为参数。 否则,随着应用程序的增长,在重构,故障排除等时很难追踪实例variables的设置。
另外,我相信在初始模板中只有在视图中使用实例variables是一种最佳的实践…从那里你应该把variables传递给助手和其他部分。
我会说你应该总是把variables明确地传递给你的帮手,原因有二:
-
你完全控制你的工作
-
最重要的是,你可以testing你的帮手
我不知道是否有任何指定的原则来pipe理这种事情,但我会通过一个论点。 这个参数不仅可以使你的帮助器更容易testing,并且你的应用程序的数据stream更容易跟随,而且它还可以让你使用一个帮助器作为单个实例以及一个列表。 如果你通过一个论点,那么两个:
<%= cockadoodledoo @egg %>
和:
<% @eggs.each do |egg| %> <%= cockadoodledoo egg %> <% end %>
将会按预期工作,而不会引入一个特殊的cockadoodledoo
来处理cockadoodledoo
中的列表,而不是一个@egg
。
由于辅助信息被混合到所有控制器中,因此可用于所有视图(包括局部和布局),build立一个明确的合同 – 参数总是明智的。
我能想到的唯一的例外是实例variables也可用于所有视图和控制器,如菜单或类似的东西。