【问题标题】:How would you implement the "tell don't ask" principle in HAML?你将如何在 HAML 中实现“告诉不问”的原则?
【发布时间】:2012-10-03 21:35:58
【问题描述】:

事情就是这样。我有一个按钮,根据场景的不同,它的行为、外观和文本都不同。以下是它目前的大致样子:

- if params[:param_A] && @statement_A
  %span.button.cancel_button{attribute: "value_B"}
    - if @statement_B
      = t('locale_A')
    - else
      = t('locale_B')
- elsif params[:param_A]
  %span.button.cancel_button{attribute: "value_A"}
    - if @statement_B
      = t('locale_A')
    - else
      = t('locale_B')

还有一个 CSS 类,两个按钮都应该有 IF statement_B 为真。

所以这是一团糟。我最近读到了我非常喜欢的“告诉,不要问”原则,所以我很想在这里应用它......但我不确定如何。

我知道我可以做一个帮手,但我想远离他们,因为原因(我确实有一些正当的理由这样做,但这些超出了这个问题的范围)。我可以将其作为最后的资源,但宁愿找到其他解决方案。

【问题讨论】:

  • 问题是,为什么要将条件逻辑放在 HAML 模板中,而不是放在控制器中?与视图中的情况相比,您对控制器内部情况的了解更多,因此在移交控制权之前计算您的值。在视图中,您只需渲染输出,几乎不需要使用条件测试。
  • 我同意@theTinMan,这种条件逻辑不应该出现在您的视野中。要么在控制器中解决它,要么至少将它放入帮助器中。

标签: ruby haml helper tell-dont-ask


【解决方案1】:

这实际上与haml无关。您可以使用 tekll-don'r ask 从示例的外观开始:

- if params[:param_A] 
  %span.button.cancel_button{attribute: @object1.value}
    = t(@object2.locale)

- if params[:param_A] 
  %span.button.cancel_button{attribute: @object.value}
    = t(@object.locale)

(取决于您的偏好/A/B 语句的真正含义)

为此,您需要在渲染之前根据语句值初始化对象。

【讨论】:

  • +1 表示“为此,您需要在渲染之前根据语句值初始化对象。”在传递给视图之前,应该在控制器中计算出对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多