Есть ли более чистый способ включить вывод уценки в HAML? - PullRequest
2 голосов
/ 09 марта 2011

Используя HAML в Rails, всякий раз, когда у меня есть какое-либо текстовое поле, которое я хочу, чтобы пользователь мог легко форматировать, я использую фильтр уценки HAML.В шаблоне, который выглядит так:

.description
  :markdown
    #{folder.description}

Это работает, но мне это никогда не нравилось.Если бы мне не понадобилась уценка для этого текстового поля, я бы просто делал:

.description= folder.description

В некоторых моих представлениях есть много примеров текста, который можно отформатировать, и это всегда нарушает потокшаблон для их вставки.

Существует ли какой-либо более чистый или более простой способ использовать отформатированный текст в уценке в шаблоне HAML, или, возможно, существует альтернативный метод добавления простого текстового форматирования в текстовое поле, которое приводит к более чистому шаблонукод?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 09 марта 2011

Я бы предложил простого помощника, что-то вроде:

# 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
2 голосов
/ 09 марта 2011

Когда у меня есть скомпилируемое форматирование (будь то уценка или текстиль), я обычно сохраняю как HTML-версию, так и версию формата в базе данных.

Так что, вероятно, у меня будет folder.description_markdown и folder.description_html полей и в папке before_save on или в другом подходящем месте я бы выполнил разбор уценки и сохранил значение html.

Затем, на ваш взгляд, все, что вам нужно, это:

.description= raw folder.description_html

И если у вас есть страница редактирования для описания, вы должны убедиться, что текстовое поле корректно редактирует поле description_markdown.

Пример обратного вызова before_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, а также снижает издержки, связанные с анализом уценки при каждом получении поля.

...