2010-01-18 3 views
2

Mon modèle Song a un attribut de texte lyrics. Depuis les nouvelles lignes sont \n -Séparé dans mes paroles, je me retrouve souvent le faire dans mon point de vue pour rendre les paroles HTML-friendly:Attribution de méthodes d'attributs de modèle

@song.lyrics.strip.gsub(/\n/, "\n<br />") 

Je répète la logique gsub sur mon application et, pire Pourtant, je ne peux pas changer le format dans lequel je stocke mes paroles sans toucher partout où j'ai essayé de les imprimer en HTML.

Je voudrais abstraite ce que je puisse écrire dans mes vues:

@song.lyrics.to_html 

Alors que la logique strip.gsub(/\n/, "\n<br />") est présente en un seul endroit dans ma demande (dans la méthode to_html).

Quelle est la meilleure façon de faire cela?

Répondre

2

Si vous devez utiliser la syntaxe @song.lyrics.to_html exacte et vous ne voulez pas créer un modèle de chanson, vous pouvez ajouter une méthode singleton à la chaîne retournée par la méthode lyrics:

class Song 
    def lyrics 
    str = read_attribute(:lyrics) 
    def str.to_html 
     strip.gsub(/\n/, "\n<br />") 
    end 
    str 
    end 
end 

Cependant, cette ce n'est pas vraiment un super design. Pour quelque chose de plus réutilisable, vous voudrez peut-être écrire un module avec une méthode to_html comme ceci:

module HtmlFormatter 
    def to_html(attribute) 
    send(attribute).strip.gsub(/\n/, "\n<br />") 
    end 
end 

Si vous include HtmlFormatter dans votre modèle de morceau que vous pouvez appeler la méthode comme ceci:

@song.to_html(:lyrics) 

Alors il ne suit pas exactement la syntaxe désirée, mais je pense que c'est un meilleur design.

Vous pouvez également envisager un modèle Lyrics séparé qui pourrait avoir toutes sortes de fonctionnalités, mais cela pourrait être trop lourd pour votre application.

+0

ne voulez certainement pas un modèle de paroles. Le module 'HtmlFormatter' sonne bien, mais il est en conflit avec acts_as_markdown (qui mélange dans une méthode séparée' to_html' pour les attributs markdown) –

+0

Pourquoi ne pas simplement utiliser markdown? Il vous donnera les sauts de ligne que vous voulez, non? Si vous ne voulez pas l'utiliser, vous devrez évidemment renommer la méthode ... –

+0

Aussi, votre méthode de paroles ne renverra-t-elle pas "nil" comme écrit? (Doit retourner 'str' après la définition de la méthode) –

1

Depuis est un problème lié à vue, vous pouvez placer votre méthode de to_html sur le module ApplicationHelper

module ApplicationHelper 

    def to_html(str) 
    str.strip.gsub(/\n/, "\n<br />") 
    end 

end 

donc, votre point de vue:

<% = to_html(@song.lyrics) %> 
Questions connexes