Rails: отображать содержимое представления в постпроцессоре (проблемы с моделью/хелпером)

У меня есть веб-приложение, в котором у меня также есть довольно сложный тип блога. Для этого блога я использую RedCarpet в качестве языка разметки в дополнение к самодельному языку разметки, который очень полезен.

На своем самодельном языке разметки я вызываю Product-views и другие партиалы из приложения. Я использую это в двух разных моделях: BlogPost и Article.

Например, запись в блоге может выглядеть примерно так:

@blog_post.unprocessed_content = "Today I would like to show you this **cool** product that we offer: [[PRODUCT#ID:123]]." 

[[PRODUCT#ID:123]] – это мой собственный язык разметки, а крутой – RedCarpet. Я использую метод render_content из ApplicationHelper следующим образом:

processed_content = render_content(@blog_post.unprocessed_content)

который будет выводить

processed_content = "Today I would like to show you a <strong>cool</strong> product that we offer: <h3>Apple</h3><img src="apple.jpg"><p>Apple is a nice fruit.</p>. Price: 1 USD."

Часть «яблоко» извлекается из частичного представления.

Метод в ApplicationHelper использует, например: - частичный рендеринг /blog_post/product_item_with_pic - разметку RedCarpet

Я пишу все статьи/сообщения в блоге в размеченном/необработанном состоянии, но имеет смысл предварительно обработать этот контент, когда я публикую и загружаю render_content() на :before_save.

Эта проблема

По сути, я хотел бы использовать это :before_save из BlogPost и статьи model, но потом я столкнулся с проблемой, пытаясь сделать вспомогательные вещи внутри модели, и все это становится беспорядочным.

Я пытался использовать:

ApplicationController.helpers.render_content(@blog_post.unprocessed_content)

но тогда он не может найти части вида, такие как /blog_post/product_item_with_pic . Такое ощущение, что я бы просто продолжал сталкиваться с такими проблемами.

Прямо сейчас у меня есть ОЧЕНЬ уродливое решение (которое работает), и оно заключается в том, чтобы предварительная обработка выполнялась в представлении при его загрузке. По сути, в admin::blog_post#show я вызываю render_content, а затем выполняю сохранение. Да, это некрасиво.

Мои вопросы

  1. Какой был бы самый элегантный способ решить эту проблему?
  2. Если на самом деле нет хорошего способа, по крайней мере, как я могу получить доступ к частичным, когда я вызываю ApplicationHelper таким образом из модели?

person Christoffer    schedule 23.08.2015    source источник
comment
Не совсем понятно, что на самом деле делает ваш render_content.   -  person EugZol    schedule 27.08.2015
comment
Вы абсолютно правы, было не очень понятно. Я отредактировал это сейчас.   -  person Christoffer    schedule 28.08.2015


Ответы (1)


Я не уверен, что полностью понимаю, чего вы хотите. Но чтобы использовать возможности рендеринга представлений Rails вне стандартного потока, нужно использовать гем render_anywhere.

require 'render_anywhere'

class Article < ActiveRecord::Base
  include RenderAnywhere
  class RenderingController < RenderAnywhere::RenderingController; end

  before_save :process_content
  attr_reader :content

  private

  def process_content
    # This variable will contain resulting HTML
    @content = render(template: 'articles/article', layout: 'articles')
  end
end

Прочтите краткую документацию, чтобы узнать, как сделать помощника доступным внутри вашего средства визуализации.

person EugZol    schedule 27.08.2015
comment
Да, я еще раз прочитал свой вопрос, и это было не очень ясно. Я исправил это, попробовал ваше решение, и с небольшой настройкой моих собственных функций это сработало. Спасибо! - person Christoffer; 28.08.2015