2009-02-09 8 views
0

Disons que dans le contrôleur, je reçois un tableau d'objets de la base de données ainsi:Meilleure façon de modifier/formater les données de base de données dans le contrôleur?

@statuses = TwitterStatus.find(:all, :order => "tweet_id DESC", :include => :twitter_user) 

J'ai aussi la boucle suivante dans la vue:

<% unless @statuses.nil? -%> 
<ol> 
    <% for status in @statuses %> 
    <li><%= h(status.text -%>/li> 
    <% end -%> 
</ol> 
<% end -%> 

j'ai beaucoup plus de données dans ma classe de modèle (info utilisateur, status_id, etc.) que je voudrais mettre dans la vue.

Le problème est qu'une grande partie de cette date doit être modifiée. J'ai besoin de formater les dates d'une certaine manière. Je voudrais insérer 'target = "_ blank"' dans n'importe quelle URL dans le champ "texte".

Ma première serait que d'avoir quelque chose comme ça dans le contrôleur:

for status in @statuses 
    status.date = status.date.formatDate 
    status.url = status.date.insertTarget 
    status.user = status.user.doUserstuff 

    #Adding new attribute 
    status.username = status.user.lookupUserName 

end 

Cela se sent juste pour moi un peu boiteux. Mais, je ne peux pas penser à quelque chose de mieux.

Répondre

3

Je veux être d'accord avec Aram. Mes vues étaient jonchées de code de mise en forme jusqu'à ce que je commence à ajouter des méthodes de modélisation qui les nettoyaient considérablement. Dans ma dernière application, c'était Names and Times (une application de planification des employés).

class Employee 

def full_name 
    self.first_name + " " + self.last_name 
end 

end 

Et le temps était toujours une douleur, le temps était partout dans mon point de vue (et vital pour l'application). Donc partout où je voulais afficher l'heure de début, au lieu d'appeler l'attribut que j'avais stocké dans la base de données, j'ai appelé une méthode personnalisée

class Schedule 

def formatted_start_time 
    self.start_time.strftime('%I:%M%p') 
end 

end 

également comme une note finale, si vous continuez le formatage du temps de la même façon partout dans votre vues, vous pouvez étendre la classe Time et rendre vos appels beaucoup plus succincts. Dans mon dossier initializers j'ai ajouté un « fichier » conversions.rb » où j'ai ajouté cette petite ligne

Time::DATE_FORMATS.update(:shift => '%I:%M%p') 

Maintenant, tout ce que je fais est est appel:

time_object.to_s(:shift) 

retourner ma chaîne formatée fréquemment utilisée partout Dans l'application. Vous pouvez avoir une liste complète de vos formats favoris pour nettoyer vos points de vue et les rendre plus compréhensibles.

2

Vous pouvez ajouter des méthodes d'instance au modèle TwitterStatus. Par exemple:

def formatted_date 
    self.date.formatDate 
end 
0

La responsabilité de la mise en forme appartient réellement à la vue.

Le "Rails Way" serait d'ajouter une méthode d'aide pour faire le formatage.

Il y a un module auxiliaire associé à chaque contrôleur et également un applicateur global.

par exemple si votre contrôleur est StatusController

module StatusHelper 

    def status_text(status) 
    # do all your formatting and HTML escaping here 
    ... 
    end 

end 

et dans la vue

<% unless @statuses.nil? -%> 
    <ol> 
    <% for status in @statuses %> 
     <li><%= status_text(status) -%></li> 
    <% end -%> 
    </ol> 
<% end -%>