Rails:在后处理器中渲染视图内容(模型/帮助器问题)

时间:2015-08-23 09:01:57

标签: ruby-on-rails view-helpers

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

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

例如,博客文章可能类似于:

public function __construct() 
{
  $this->middleware('auth');
}

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

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

将输出

processed_content = render_content(@blog_post.unprocessed_content)

“apple”部分是从视图部分获取的。

ApplicationHelper中的方法使用例如: - render partials / blog_post / product_item_with_pic - RedCarpet标记

我以标记/未处理状态编写所有文章/博客帖子,但是当我发布并在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." 上加载render_content()时,预处理这些内容是完全合理的。

问题

基本上,我想使用它:来自BlogPost和Article 模型的before_save,但后来我遇到了尝试从模型中做辅助内容的问题,这一切都变得混乱。< / p>

我试图使用:

:before_save

但是它找不到像/ blog_post / product_item_with_pic那样的视图部分。感觉就像我会继续碰到这样的问题。

现在,我有一个非常难看的解决方案(可行),并且在加载视图时在视图中完成预处理。基本上,在admin :: blog_post #show中我调用render_content然后执行保存。是的,这太丑了。

我的问题

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

1 个答案:

答案 0 :(得分:2)

我不确定我完全理解你想要什么。但是要在标准流程之外使用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,了解有关如何在渲染器内提供帮助的信息。