【问题标题】:Should I use helper method for this method?我应该为此方法使用辅助方法吗?
【发布时间】:2019-04-02 10:45:14
【问题描述】:

假设我有这个辅助方法,可以根据模型人的属性身高和国家/地区检查一个人的身高是否高于平均身高或低于平均身高。 person_helper.rb

module PersonsHelper
  def height_status(country, height)
    if country == "jp"
      return "above height average" if height >= 170
      return "below height average"
    end
    ... 
  end

end

这是一个好习惯,或者我应该为此在模型中创建一个派生属性 人.rb

class Person

  def height_status
    if country == "jp"
      return "above height average" if height >= 170
      return "below height average"
    end
  end

end

用法主要是为了查看所以我想知道 helper 是否是正确的做法?

【问题讨论】:

  • 也许将两者结合起来:让Person#height_status 将其数据传递给Statistics 模块的相应辅助方法。
  • 我也想到了。将具有 if 语句的方法放入模型中,然后在助手上调用它。但问题是我会在视图中只使用一次就完成所有这些操作。请问您对此有何看法?

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

我会这样做:

class Person
  AVERAGE_HEIGHTS_BY_COUNTRY = {
    jp: 170,
    us: 180,
    ...
  }

  def above_average_height?
    height > AVERAGE_HEIGHTS_BY_COUNTRY[country]
  end
end

然后在您的视图中使用该布尔值:

<%= person.above_average_height? ? "very tall" : "a bit short" %>

如果您想使用帮助器根据布尔值生成该解释,您可以。或者更好的选择可能是使用 I18n。

【讨论】:

  • 嗨,模型 Person 包含此人的国家/地区。请检查我的问题,我认为这会极大地影响您的回答。此外,我并不是在要求关于幻数和其他东西的最佳实践。我的主要问题是关于 helper /model 的使用。
  • 谁提到了幻数?我只是想避免你有一个 500 行的 if 语句。我将更新国家作为人的属性。
  • 你能解释一下为什么使用模型比辅助方法更好吗?我考虑了这两种方法并得出结论,如果我在模型中放置一个视图专用的方法,那将是一个糟糕的代码,但如果我把它放在帮助程序中,我的代码看起来就不像是面向对象的。你能告诉我你对此的看法吗?
  • 助手用于帮助您显示内容。它们不是您放置业务逻辑的地方。
【解决方案2】:

我会问这些问题:

  • 知道他们在各个国家/地区的height_status 是一个人的责任吗? (如果是,返回一个英文本地化字符串是正确的响应吗?)或者
  • 是视图的问题吗?仅因为您想在页面上显示或设置字符串样式而需要存在的东西?

当您认为人们应该知道这一点时,请将代码放入模型中。如果您只需要 HTML 视图中的此信息,则应将其放置在 Helper 或 Presenter 中。

【讨论】:

  • 我最倾向于使用Helper,因为它只会在视图中使用。但正如@Jon 所说,助手不应该像 if 语句那样有逻辑。
  • 了解自己的身高状态不是个人的责任,主要是观点关注。
  • Jon 写道,Helper 不应该包含业务逻辑。我很确定我们的意思是复杂的规则。他没有写任何关于简单的if 声明。而且我认为在助手中拥有简单的条件是完全可以的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2011-03-12
相关资源
最近更新 更多