在模型中使用辅助方法是否可行,更重要的是,是否合适?
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
但老实说,除非您在不同上下文的大量页面上使用类似的东西,否则将此代码移至助手可能比将其留在视图中要大材小用。
所以我在 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
但老实说,除非您在不同上下文的大量页面上使用类似的东西,否则将此代码移至助手可能比将其留在视图中要大材小用。