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也可用于所有视图和控制器,如菜单或类似的东西。