我想在数据库中存储动态添加/编辑/等的页面。除了页面标题和内容,我还提供了要使用的布局以及控制器名称和视图名称,以支持视图(例如页面表中的文本字段)将使用的模型的实例化。
我在从数据库渲染文本时仍然无法使用布局。
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
,但两者似乎都没有在布局中呈现内容。
我该如何做到这一点?
答案 0 :(得分:0)
通常,如果您想允许用户在rails应用程序中编辑html页面并将页面存储在数据库中,标准方法是使用名为liquid
的模板语言。
它允许您定义动态内容,非常适合在rails中使用CMS系统,我认为您最好先查看一下。
以下是一些重要的链接
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/