【问题标题】:Multiple Rails controller requests on one page一页上有多个 Rails 控制器请求
【发布时间】:2013-04-12 20:54:09
【问题描述】:

前几天,我偶然发现了 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 请求?

感谢您的帮助!

【问题讨论】:

  • 对于仪表板视图,我不确定我是否会过于努力和快速地坚持这一点。仪表板的全部意义在于在一个位置集中显示一堆数据。也就是说,您可以实例化父级并使用装饰器之类的东西(通过 draper)来获取派生数据。这使控制器和视图都非常干净。
  • 感谢@ChrisHeald,我终于有机会查找 Draper/decorator。在这种情况下,绝对是一种可以帮助我的模式。但是,您认为我在这里所做的数据操作类型是否足够“以演示为中心”(引用 Draper README),或者更多属于模型的内容?

标签: ruby ruby-on-rails-3 oop model-view-controller


【解决方案1】:

答案是

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 请不要发布仅链接的答案,因为如果链接被删除,它们可能会失效。
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      相关资源
      最近更新 更多