渲染存储在数据库中的动态页面

时间:2014-02-09 06:31:59

标签: ruby-on-rails-3 actioncontroller

我想在数据库中存储动态添加/编辑/等的页面。除了页面标题和内容,我还提供了要使用的布局以及控制器名称和视图名称,以支持视图(例如页面表中的文本字段)将使用的模型的实例化。

我在从数据库渲染文本时仍然无法使用布局。

class AboutController < BaseController
  def index
    @model_data = ...

    render_dynamic_page("about", "index")
  end
end

class BaseController < ApplicationController
  layout "public"

  def render_dynamic_page(controller_name, action_name)
    page = Page.where("`controller_name` = :controller_name AND `action_name` = :action_name", { :controller_name => controller_name, :action_name => action_name }).first

    render :layout => page.layout_name, :text => page.content
  end
end

我在这里使用:text,我也尝试了:inline,但两者似乎都没有在布局中呈现内容。

我该如何做到这一点?

3 个答案:

答案 0 :(得分:0)

通常,如果您想允许用户在rails应用程序中编辑html页面并将页面存储在数据库中,标准方法是使用名为liquid的模板语言。

它允许您定义动态内容,非常适合在rails中使用CMS系统,我认为您最好先查看一下。

以下是一些重要的链接

liquid home page

rails cast about liquid

git hub page

SO本身有很多资源。 :)

答案 1 :(得分:0)

我非常接近 - 我只需要将参数的顺序切换为render方法:

render :inline => page.content, :layout => (page.layout_name || "public")

如果数据库中未指定public,我还添加了默认布局以使用page.layout_name。值得一提的另一件事是:text:inline之间的区别 - 只有:inline似乎实际上“处理”了内容,就好像它是ERB而:text选项只是字面输出原始文本。

注意:我最后使用ERB.new(page.content)为每个页面创建了一个ERB,缓存了动态ERB列表,然后从缓存中提取预渲染的ERB并使用以下方法显示它:

render :inline => the_cached_erb.result(binding), :layout => (page.layout_name || "public")

仍然有一些奇怪的行为,但我认为最终会有效。

答案 2 :(得分:0)

仅供参考,对于更多工具,您可能需要查看Mercury编辑器:

http://jejacks0n.github.io/mercury/

https://github.com/jejacks0n/mercury

http://railscasts.com/episodes/296-mercury-editor