【问题标题】:Rails View DRYness - Do you set variables in the view or just make clean methods?Rails View DRYness - 您是在视图中设置变量还是只创建干净的方法?
【发布时间】:2010-12-01 14:04:52
【问题描述】:

我有一个视图,其中我有 3 次相同的链接(实际视图很大):

%h1= link_to "Title", model_path(@model, :class => "lightbox")
= link_to "Check it out", model_path(@model, :class => "lightbox")
%footer= link_to "Last time", model_path(@model, :class => "lightbox")

model_path(@model, :class => "lightbox") 调用虽然相当干净,但可以更精简地包裹它(也许你有更多选择,所以这样做是值得的):

def popup_model_path(model)
  model_path(model, :class => "lightbox")
end

我的问题是,我必须在视图中重新计算该路径 3 次。 a) 干燥和 b) 优化性能的首选方法是什么?

我认为在视图顶部设置变量可能是个好主意:

- path = model_path(@model, :class => "lightbox")
-# ... rest of view

到最后几乎就像小胡子一样。你有什么想法?

【问题讨论】:

    标签: ruby-on-rails dry


    【解决方案1】:

    我认为在视图中使用变量是一个好主意。由于这些方法调用完全相同。

    在某些情况下我更喜欢 Matt 提出的解决方案,但在这种情况下不喜欢,因为我觉得它令人困惑:它被缓存在方法中的事实尚不清楚,如果我想在其中看到两个不同的模型一个页面我仍然得到两个模型的第一个缓存链接。

    所以在这种情况下,我会选择更明确的方法并将其分配给视图中的变量。

    【讨论】:

    • 这是一个很好的观点(只是把它搞砸了),我修复了代码以支持多个调用。
    【解决方案2】:

    真的讨厌将变量放在视图中。我会将您的助手更改为

    def popup_model_path(model)
      @model_path ||= {}
      @model_path[model] ||= model_path(model, :class => "lightbox")
    end
    

    “记忆”它,只保留三个函数调用。

    【讨论】:

    • 但同样,这是一个很好的提示,但使用不必要的实例变量会消耗更多内存:-(
    • @nimesh nikum:你牺牲一些内存来获得一些速度。使用局部变量也会消耗更多内存,所以我认为你的论点不成立。我更喜欢使用更多内存而不是处理器速度。
    • @Nimesh:它消耗的和在视图中做的一样多。唯一的区别是您使用的是实例变量而不是局部变量。归根结底,您谈论的是 3 个小字符串,因此您使用的内存量并不值得考虑。
    【解决方案3】:

    这似乎是过早优化的可能情况。制作像popup_model_path 这样的函数是一个非常干燥的想法。特别是如果那段代码,不管它最初可能多么简洁,将在多个视图中频繁使用。但是,在我看来,担心在一个视图中计算 3 次路径对性能的影响是没有必要的。除非我们谈论的是每次视图会被使用数十或数百次的东西,并且您期望有许多同时用户,并且该应用程序正在共享服务器上运行或者我真的看不到您的东西目前对性能有任何明显的影响。

    作为一般规则,我会尽量避免在我的视图代码中出现变量。它们使阅读变得更加困难,并且除了一些例外(例如与显示列表等内容的循环直接相关的变量),我觉得它们有点违背了我理解的整个 MVC 概念。

    我认为最重要的是,您应该努力编写易于阅读、可理解和可维护的代码;既适用于您自己,也适用于以前不熟悉您的项目的其他人。 popup_model_path 正如你现在所拥有的那样,它非常简单,任何了解 Rails 的人都可以跟随你正在做的事情。我认为没有必要让它比这更复杂,因为它不是非常重复。我希望我能找到我记得不久前读过的这篇出色的博客文章,其中指出干掉你的代码很棒,但它有其局限性,就像所有伟大的事情一样,收益递减定律最终会发挥作用。

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 2023-03-22
      • 2012-10-04
      • 2011-08-22
      • 1970-01-01
      • 2010-09-17
      相关资源
      最近更新 更多