Rails助手应该假设存在实例变量,还是应该将它们作为参数接收?

时间:2011-06-24 23:04:00

标签: ruby-on-rails function parameters parameter-passing

我想知道是否有一个特定的编程原理(Demeter?)支持Rails助手永远不应该使用控制器实例变量的想法,而是应该接收诸如函数参数之类的变量。例如,假设我的ChickensController#squawk操作创建了一个名为@egg的实例变量。此外,假设squawk视图包含对名为cockadoodledoo的帮助程序的调用,如下所示:

def cockadoodledoo
  @egg.to_s
end

@egg作为参数传递会更好或不必要地冗长,以便视图调用cockadoodledoo(@egg)并使助手类似:

def cockadoodledoo(egg)
  egg.to_s
end

我希望你们中的一个快乐的黑客在星期五下午感到厌倦,以便给出答案。 Cockadoodledoo!

This question here is similar, but was never accurately answered.

4 个答案:

答案 0 :(得分:32)

接受他们作为一个参数。否则,随着应用程序的增长,在重构,故障排除等时,很难跟踪实例变量的设置位置。

另外,我认为一般的最佳做法是只在初始模板中的视图中使用实例变量...并且从那里你应该将var传递给帮助者和其他部分。

答案 1 :(得分:19)

我会说你应该总是明确地将变量传递给你的助手,原因有二:

  • 您完全掌控自己的行为

  • 首先,你可以测试你的助手

答案 2 :(得分:11)

我不知道是否有任何命名原则来管理这类事情,但我会传递一个论点。该参数不仅可以使您的帮助程序更容易测试,而且您的应用程序的数据流更容易遵循,但它也可以让您为单个实例和列表使用一个帮助程序;如果你传递一个参数,那么:

<%= cockadoodledoo @egg %>

<% @eggs.each do |egg| %>
    <%= cockadoodledoo egg %>
<% end %>

将按预期工作,而不会引入处理cockadoodledoo中的列表而不是单个@eggs的特殊@egg

答案 3 :(得分:7)

由于辅助消息被混合到所有控制器中,因此可用于所有视图(包括部分和布局),因此建立明确的合同 - 参数总是明智的。

我能想到的唯一例外是当一个实例变量也可用于所有视图和控制器时,比如菜单或类似的东西。