2017-03-01 2 views
0

J'ai donc la ligne de code suivante dans un html.erb:L'utilisation d'une méthode d'aide dans un modèle est-elle possible et, surtout, appropriée?

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

et je voudrais simplifier avec quelque chose comme:

<%= member.last_seen %> 

Sans penser que j'ai essayé d'écrire un par exemple méthode de membre de classe comme ceci:

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 

Il ne fonctionne pas, cependant, puisque je ne peux pas accéder à la méthode d'assistance: distance_of_time_in_words en t Les modèles.

Quelle serait la manière appropriée de faire fonctionner <%= member.last_seen %>.

Répondre

1

Les modèles ne sont pas l'endroit approprié pour mettre la logique de présentation, ce qui est ce que c'est. C'est ce à quoi servent les méthodes d'assistance. En règle générale, si les données brutes ne proviennent pas d'un modèle, vous mélangez la présentation avec le domaine.

Il serait plus approprié de faire quelque chose comme:

# 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 

Mais pour être honnête, à moins que vous utilisez quelque chose comme ça sur une tonne de pages dans des contextes différents, déplacer ce code à une aide peut être overkill vs laisser dans la vue.

+0

Ok Gavin merci. C'est logique et c'était mon autre option j'espérais qu'il pourrait y avoir un moyen de l'appeler comme s'il s'agissait d'une méthode d'instance, mais ce n'est pas si grave. Merci beaucoup – Andrew