前几天我偶然发现了Sandi Metz的rules,其中一人读到了
当一个调用进入你的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请求?
我很感激帮助!
答案 0 :(得分:1)
答案是否。
AJAX专门为此目的而构建,以克服多个http请求的缺点。加上多个http请求,而页面加载由于性能下降而不受欢迎。对于一个小项目来说,这似乎是一条有利可图的道路,但是当它扩展时,你肯定会遇到巨大的漏洞。
虽然我不是它的忠实拥护者,但是在这种情况下,遵循这条路可以为你省去很多努力。 :)
答案 1 :(得分:1)
推荐的方法是使用Facade Pattern。 Thoughtbot在"仅实例化控制器中的一个对象"中提供了如何处理此问题的完美示例。本篇博文的一节:
http://robots.thoughtbot.com/sandi-metz-rules-for-developers
答案 2 :(得分:0)
当一个调用进入你的Rails控制器时,你只能实例化一个对象来做任何需要做的事情。
我看到这条规则的用处,但我认为你可以用稍微不同的方式解释它。加载控制器时,您确实希望它尽可能少地执行。这是给定的。
但是,在您的情况下,您似乎需要加载大量不同的数据。除了看起来很难看之外,你会看到代码也越来越大,因为你的仪表板支持越来越多的指标。您并不希望处于这样的情况:代码行数与应用程序显示的数据量成比例增加。
相反,发送一个对象 - 您需要显示的所有数据的字典。我建议将该字典的构造移到建立它的模型(或更好的服务)(可能基于某种配置)。控制器应该只是从某个地方获取该对象并以正确的格式将其发回。