在模型中使用辅助方法是否可行,更重要的是,是否合适?

Is using a helper method in a model possible and, more importantly, appropriate?

所以我在 html.erb 中有以下代码行:

 <%= "Last seen #{distance_of_time_in_words(Time.now.localtime, member.last_sign_in_at.localtime, true, :highest_measure_only => true)} ago" %>

我想用类似的东西来简化它:

<%= member.last_seen %>

我没有多想就尝试为 class 成员编写一个实例方法,如下所示:

  def last_seen
    if last_sign_in_at.nil?
      "User hasn't signed in yet"
    else
      "Last seen #{distance_of_time_in_words(Time.now.localtime, self.last_sign_in_at.localtime, true, :highest_measure_only => true)} ago"
    end
  end

但是它不起作用,因为我无法访问模型中的辅助方法:distance_of_time_in_words

使 <%= member.last_seen %> 工作的合适方法是什么。

模型不是放置表示逻辑的合适位置,这就是问题所在。这就是辅助方法的用途。一个好的经验法则是,如果它不是来自模型的原始数据,那么您就是将表示与领域混合在一起。

做这样的事情会更合适:

# app/helpers/member_helper.rb

module MemberHelper   
  def last_seen(member)
    if member.last_sign_in_at.nil?
      "User hasn't signed in yet"
    else
      "Last seen #{distance_of_time_in_words(Time.now.localtime, member.last_sign_in_at.localtime, true, :highest_measure_only => true)} ago"
    end
  end
end

但老实说,除非您在不同上下文的大量页面上使用类似的东西,否则将此代码移至助手可能比将其留在视图中要大材小用。