Дезинфекция и текстильизация в модели

Это двойной вопрос.

У меня есть приложение RoR (3.0.7), которое принимает пользовательский ввод, например, создание новостной статьи. До сих пор пользовательский ввод был в простом XHTML, поскольку пользователи являются доверенными. Однако создание сообщений на веб-сайте в XHTML является сложной задачей для некоторых пользователей, поэтому мы попытаемся перейти к текстилю.

Для использования текстиля я установил RedCloth.

Поскольку мы не будем преобразовывать уже существующие новостные статьи в текстильные, что, как я знаю, было бы правильным сделать для унифицированных данных, план состоит в том, чтобы использовать RedCloth для контента только после указанной даты.

В представлениях я бы просто использовал условие, которое проверяет дату created_at, а затем вызывает RedCloth перед выводом. Однако это означало бы, что мне пришлось бы перебирать все представления и вставлять условное выражение всякий раз, когда я представляю этот конкретный контент. Возможно, я мог бы даже создать помощника, который минимизировал бы код, который мне пришлось бы копировать.

Вместо того, чтобы делать это и держать его СУХИМ, я решил переместить логику в модель. Модель имеет столбец с именем articlecontent. Я придумал следующий код, который пока работает:

def articlecontent
  if !self.new_record? && created_at.to_datetime > 'YYYY.MM.DD'.to_datetime
    articlecontent_in_textile = self[:articlecontent]
    articlecontent_in_html = RedCloth.new(articlecontent_in_textile, [:filter_html]).to_html
    return articlecontent_in_html
  else
    return self[:articlecontent]
  end
end

Итак, мои вопросы:

1) Это правильный путь? Или я должен определить какой-то ViewHelper?

2) Кажется, я не могу вызвать помощника по очистке в модели, возможно, по уважительной причине. Есть ли способ вызвать помощника в модели?

Спасибо Марк


person Marc Andersen    schedule 30.06.2011    source источник


Ответы (1)


Я бы пошел с определением помощника, так как это логика, которая действительно принадлежит представлению, а не модели.

Однако вы можете захотеть определить метод модели, который возвращает тип используемой разметки:

def markup_type
   created_at > MARKUP_CHANGED_DATETIME ? "textile" : "html"
end

Поскольку MARKUP_CHANGED_DATETIME является константой, которую вы можете определить в файле конфигурации.

Или, в качестве альтернативы, добавьте атрибут markup_type в модель с помощью миграции и установите для всех предыдущих атрибутов значение «html», а для всех последующих — значение «текстиль» — это позволит вам продолжать использовать оба варианта одновременно , или постепенно менять старые.

person Frankie Roberto    schedule 30.06.2011
comment
Спасибо. Я возьму на себя подходы, которые вы упомянули. Я не был уверен, с чего начать, и вы подтвердили мои сомнения :) - person Marc Andersen; 01.07.2011