是否有更简洁的方法在HAML中启用降价输出?

时间:2011-03-09 01:05:34

标签: ruby-on-rails ruby-on-rails-3 haml markdown

在Rails中使用HAML,每当我有一个我希望用户能够轻松格式化的文本字段时,我就会使用HAML的降价过滤器。在看起来像这样的模板中:

.description
  :markdown
    #{folder.description}

这很有效,但我从来都不喜欢它。如果我在这个文本字段上不需要降价,我就会这样做:

.description= folder.description

在我的一些视图中,有许多文本可以标记为格式化,并且它总是会破坏模板的流程以插入它们。

是否有更简洁的方法在HAML模板中使用markdown格式的文本,或者是否有另一种方法可以将简单的文本格式添加到文本字段中,从而产生更清晰的模板代码?

谢谢!

2 个答案:

答案 0 :(得分:6)

我会建议一个简单的帮手,例如:

# app/helpers/application_helper.rb
def markdown(text)
  BlueCloth::new(text).to_html.xml_safe
end
alias :md :markdown

# app/views/folders/show.html.haml
.description= md folder.description

答案 1 :(得分:2)

当我有可编辑的格式(无论是降价还是纺织品)时,我通常会将html版本和格式版本存储在数据库中。

所以我可能会有folder.description_markdownfolder.description_html字段,并且在before_save文件夹或其他适当的位置,我会在那里执行markdown解析,并保存html值。

然后,在您看来,您所需要的只是:

.description= raw folder.description_html

如果您有描述的编辑页面,您将确保文本字段正确编辑description_markdown字段。

我现在要保存纺织品格式的示例之前的on_save回调就在这里:

class Page < ActiveRecord::Base
  validates_presence_of :name
  validates_uniqueness_of :name

  # Note that the {attr}_changed? method is given to you
  # by ActiveRecord for every database field on your model.
  before_save :update_html, :if => :textile_changed?

  def convert_textile
    RedCloth.new(textile).to_html
  end

  protected
    def update_html
      self.html = convert_textile
    end
end

我觉得这样可以让haml模板更容易理解,并且还可以减少每次检索字段时解析markdown的开销。