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 然后执行保存。是啊,很丑。
我的问题
- 解决这个问题最优雅的方法是什么?
- 如果没有真正好的方法,至少,当我从模型中这样调用 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 以获取有关如何在渲染器中使用助手的信息。
我有一个网络应用程序,其中我还有一个相当复杂的博客类型。对于这个博客,除了自制的标记语言外,我还使用了 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
.
问题
基本上,我想使用 BlogPost 和文章 model 中的 :before_save 但后来我 运行 进入了尝试做的问题模型中的辅助工具,一切都变得一团糟。
我尝试使用:
ApplicationController.helpers.render_content(@blog_post.unprocessed_content)
但是它找不到像 /blog_post/product_item_with_pic 这样的局部视图。感觉我会一直碰到这样的问题。
现在,我有一个非常丑陋的解决方案(有效),它是在加载视图时在视图中完成预处理。基本上,在 admin::blog_post#show 中我调用 render_content 然后执行保存。是啊,很丑。
我的问题
- 解决这个问题最优雅的方法是什么?
- 如果没有真正好的方法,至少,当我从模型中这样调用 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 以获取有关如何在渲染器中使用助手的信息。