Rails:在 post-处理器中呈现视图内容(模型/助手问题)

Rails: Render view content in post-processor (model / helper issues)

我有一个网络应用程序,其中我还有一个相当复杂的博客类型。对于这个博客,除了自制的标记语言外,我还使用了 RedCarpet 作为标记语言,这非常有用。

在我自制的标记语言中,我从应用程序调用产品视图和其他部分。我在两种不同的模型中使用它:BlogPost 和 Article。

例如,博客 post 可以是这样的:

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

[[PRODUCT#ID:123]] 是我自己的标记语言,cool 是 RedCarpet。我使用 ApplicationHelper 中的 render_content 方法,如下所示:

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."

"apple" 部分是从视图部分获取的。

ApplicationHelper中的方法使用举例: - 渲染局部 /blog_post/product_item_with_pic - RedCarpet 标记

我将所有 articles/blog post 写成 markup/unprocessed 状态,但是 预处理 这个内容是完全有意义的我在 :before_save.

上发布并加载了 render_content()

问题

基本上,我想使用 BlogPost 和文章 model 中的 :before_save 但后来我 运行 进入了尝试做的问题模型中的辅助工具,一切都变得一团糟。

我尝试使用:

ApplicationController.helpers.render_content(@blog_post.unprocessed_content)

但是它找不到像 /blog_post/product_item_with_pic 这样的局部视图。感觉我会一直碰到这样的问题。

现在,我有一个非常丑陋的解决方案(有效),它是在加载视图时在视图中完成预处理。基本上,在 admin::blog_post#show 中我调用 render_content 然后执行保存。是啊,很丑。

我的问题

  1. 解决这个问题最优雅的方法是什么?
  2. 如果没有真正好的方法,至少,当我从模型中这样调用 ApplicationHelper 时,如何访问部分?

我不确定我完全理解你想要什么。但是要在标准流程之外使用 Rails 视图渲染功能,应该使用 render_anywhere gem.

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

阅读 brief documentation 以获取有关如何在渲染器中使用助手的信息。