给出一个模型属性方法

时间:2010-01-18 22:10:10

标签: ruby-on-rails

我的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 个答案:

答案 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) %>
相关问题