1

前几天,我偶然发现了 Sandi Metz 的规则,其中一个读到

当你的 Rails 控制器调用时,你只能实例化一个对象来做任何需要做的事情。

对 Rails 来说还是很新,但我一直认为我的控制器方法有一些味道,这证实了这一点。我有一个父模型的仪表板视图,它显示有关他们的孩子(不同的模型)和孩子的挑战(另一个模型)的信息,所有这些都具有不同的控制器。这是我们的控制器方法之一的示例。

def dash
  @parent = current_user
  @children = @parent.children
  @completed_challenges = @parent.assigned_challenges.where("parent_id =?", @parent.id).where("completed =?", true)
  @validated_challenges = @parent.assigned_challenges.where("parent_id =?", @parent.id).where("validated =?", true)
  @enabled_rewards = @parent.enabled_rewards.where("parent_id =?", @parent.id)
end

我想知道是否可以发送多个请求以从它们各自的控制器中获取所有这些对象,而不是将它们全部集中在一个请求中。我知道我可以用 Ajax 做到这一点,但是有没有办法在页面加载时只做多个 http 请求?

感谢您的帮助!

4

3 回答 3

1

推荐的方法是使用外观模式。Thoughtbot 在这篇博文的“仅在控制器中实例化一个对象”部分提供了一个如何处理此问题的完美示例:

http://robots.thoughtbot.com/sandi-metz-rules-for-developers

于 2015-01-30T07:09:33.533 回答
1

答案是否定的。

AJAX 是专门为此目的而构建的,以克服多个 http 请求的缺点。再加上多个 http 请求,而页面加载由于性能下降而被皱眉。对于一个小项目来说,这似乎是一条有利可图的道路,但当它扩大规模时,你肯定会遇到巨大的漏洞。

虽然我不是它的忠实粉丝,但在这种情况下,走老路可以为你节省很多精力。:)

于 2013-04-12T22:51:37.097 回答
0

当你的 Rails 控制器调用时,你只能实例化一个对象来做任何需要做的事情。

我看到了这条规则的用处,但我认为你可以用稍微不同的方式来解释它。当你加载一个控制器时,你确实希望它做的越少越好。这是给定的。

但是,在您的情况下,您似乎有很多不同的数据要加载。除了看起来丑陋之外,您还会看到随着仪表板支持越来越多的指标,代码也会变得越来越大。您真的不希望处于代码行数与应用程序显示的数据量成比例增加的情况。

相反,发送一个对象 - 您需要显示的所有数据的字典。而且我建议将该字典的构建移至构建它的模型(或者更好的是服务)(可能基于某种配置)。控制器应该只是从某个地方获取该对象并以正确的格式将其发送回。

于 2013-04-13T10:53:18.653 回答