我的Song
模型具有lyrics
文字属性。由于新的行\n
- 在我的歌词中分开,我经常发现自己在我的观点中这样做,以使歌词HTML友好:
@song.lyrics.strip.gsub(/\n/, "\n<br />")
我在我的应用程序中重复gsub
逻辑,更糟糕的是,我无法更改我存储歌词的格式而不会触及我尝试将它们打印为HTML的所有位置。
我想抽象一下这样我就可以在我的观点中写下这个:
@song.lyrics.to_html
因此strip.gsub(/\n/, "\n<br />")
逻辑仅存在于我的应用程序的一个位置(在to_html
方法中)。
最好的方法是什么?
答案 0 :(得分: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)
所以它并没有完全遵循你想要的语法,但我认为这是一个更好的设计。
您可能还想考虑一个单独的Lyrics模型,它可以具有各种功能,但这对您的应用程序来说可能太重了。
答案 1 :(得分:1)
由于是与视图相关的问题,您可以将to_html方法放在ApplicationHelper模块上
module ApplicationHelper
def to_html(str)
str.strip.gsub(/\n/, "\n<br />")
end
end
所以,就你的观点而言:
<% = to_html(@song.lyrics) %>