我有一些可编辑的页面,它们作为文本存储在我的数据库中。这些页面将在我的视图中调用,如...
#app/views/static_pages/scheduling_text.html.erb
<%= Page.find_by_name("New Registration").content %>
Page.content的类型为“text”(不是字符串)。包含变量的文本的一部分看起来像......
您已在#{&lt;%= @ registration.orientation.class_date%&gt;}处成功注册新学生入学...
如果我在视图中调用此内容,我只是获取文本,而不是模型值。如何让这些页面访问模型值?我也尝试在文本周围添加#{}但没有成功。
答案 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变量,所以这就是缺点。只需让您的用户知道{{}}之间的任何内容都不会使用。
希望这有助于其他人。