允许用户编辑包含变量的页面

时间:2013-12-11 17:59:43

标签: ruby-on-rails

我有一些可编辑的页面,它们作为文本存储在我的数据库中。这些页面将在我的视图中调用,如...

#app/views/static_pages/scheduling_text.html.erb
<%= Page.find_by_name("New Registration").content %>

Page.content的类型为“text”(不是字符串)。包含变量的文本的一部分看起来像......

您已在#{&lt;%= @ registration.orientation.class_date%&gt;}处成功注册新学生入学...

如果我在视图中调用此内容,我只是获取文本,而不是模型值。如何让这些页面访问模型值?我也尝试在文本周围添加#{}但没有成功。

2 个答案:

答案 0 :(得分:0)

这似乎与Rails: storing erb templates in database

重复

鉴于此,应该为你做这个伎俩,或者至少足够接近让你开始:

<%= sanitize ERB.new(Page.find_by_name("New Registration").content).run %>

此外,如果内容不是用户提供的,则可以删除sanitize(这主要是安全问题)。

我使用HAML处理完成了类似的操作:

= sanitize Haml::Engine.new(article.content).render

供参考,这是适当的ERB文件:http://ruby-doc.org/stdlib-2.0.0/libdoc/erb/rdoc/ERB.html

答案 1 :(得分:0)

好吧,经过多次哭泣和咬牙切齿之后,这就是我提出的解决方案。首先我使用的是mustache。这比将erb存储在模板中更安全,并防止恶意将sql注入到您的应用程序中。我只是将'mustache'添加到我的gemfile而不是mustache-rails,因为它似乎更新了。然后我创建了一个具有两个属性的简单页面模型:name和:content。我正在使用页面模型来存储原始胡子代码。

以下是相关文件......

在我的控制器中,我打电话给...

#app/controllers/registrations_controller.rb
def create
    @registration = Registration.new(params[:registration])

    respond_to do |format|
      if @registration.save
        if @registration.orientation != nil
          format.html { render "scheduling_text.html.erb" }

然后我的观点看起来像......

#app/views/registrations/scheduling_text.html.erb
<%= Mustache.render(Page.find_by_name("New Registration").content, {:registration => @registration }).html_safe %>
<%= link_to 'Back', orientations_path %>
           ...

然后在我的页面模型中,我有类似......

您已于{{registration.orientation.class_date}} {{registration.orientation.class_time}}成功注册了新学生入学指导。请在预定的迎新活动前10分钟到达。请记住,在注册课程之前,您必须参加此迎新会。

...

使用带有脚手架的页面模型可以很好地工作,因为它为您提供了允许用户编辑内容的新操作,更新操作和创建操作。注意,它们很容易弄乱你的ruby变量,所以这就是缺点。只需让您的用户知道{{}}之间的任何内容都不会使用。

希望这有助于其他人。