2010-01-18 87 views
2

我的Song模型具有lyrics文本屬性。由於新線\n - 分隔在我的歌詞,我經常發現自己在我的意見這樣做是爲了使歌詞HTML友好:給出模型屬性方法

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

我重複gsub邏輯都在我的應用程序,而且,更糟糕儘管如此,我仍然無法改變我存儲歌詞的格式,而無需在任何地方觸摸我嘗試將它們打印爲HTML格式。

我想摘要,這樣我可以在我的意見寫:

@song.lyrics.to_html 

從而使strip.gsub(/\n/, "\n<br />")邏輯存在於只有一個地方在我的應用程序(在to_html方法)。

這樣做的最好方法是什麼?

回答

2

如果你需要使用的確切@song.lyrics.to_html語法和你不希望創建一個歌詞模型,你可以添加一個單獨的方法來通過lyrics方法返回的字符串:

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

然而,這並不是一個很棒的設計。對於更多的東西可重用你可能想要寫一個模塊與to_html方法是這樣的:

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

如果include HtmlFormatter在你的歌聲模型,你可以調用的方法是這樣的:

@song.to_html(:lyrics) 

所以它並沒有完全遵循你所期望的語法,但我認爲這是一個更好的設計。

您可能還想考慮一個單獨的歌詞模型,它可能具有各種功能,但這對您的應用程序來說可能太重了。

+0

肯定不希望歌詞模型。 'HtmlFormatter'模塊聽起來不錯,但它與acts_as_markdown(混合在一個單獨的'to_html'方法中用於降價屬性) – 2010-01-18 23:13:26

+0

爲什麼不使用markdown?它會給你你想要的換行符,對吧?如果你不想使用它,你顯然必須重命名該方法... – 2010-01-18 23:20:02

+0

另外,你的歌詞方法是否會返回'nil'? (需要在方法定義後返回'str') – 2010-01-18 23:21:20

1

既然是一個視圖相關的問題,你可以把你的to_html方法ApplicationHelper模塊

module ApplicationHelper 

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

end 

等等,對你的看法:

<% = to_html(@song.lyrics) %> 
相關問題