为何使用ERB输出数据库中表单代码时出现错误?
问题原因与解决方案
嘿,这个问题我之前也踩过坑!核心原因是你把包含ERB标签的代码直接存在数据库里,然后试图用普通的ERB输出语法去渲染它,导致了ERB标签嵌套的语法错误。
举个例子,假设你数据库里存的content是:
<%= form_for :article do |f| %> <div class="form-group"> <%= f.label :title, "Title" %> <%= f.text_field :title, class: 'form-control' %> </div> <% end %>
当你在视图里写<%= @page.content %>时,Rails解析ERB模板的时候,会把里面的<%= form_for... %>当成外层<%= %>的一部分,相当于写成了:
<%= "<%= form_for :article do |f| %>..." %>
这种嵌套的ERB标签完全不符合语法规则,自然会抛出错误。
正确的解决方法
要让数据库里的ERB代码被正确解析并渲染,你需要先把存储的字符串转换成可执行的ERB代码,再输出到视图里。
步骤1:在Page模型中添加解析方法
打开你的app/models/page.rb,添加一个方法来处理ERB解析:
class Page < ApplicationRecord # 解析content中的ERB代码 def rendered_content # 使用ERB类解析字符串,binding传递当前上下文 ERB.new(content).result(binding) end end
步骤2:在视图中渲染解析后的内容
在视图里,用raw方法输出解析后的内容(避免Rails自动转义HTML):
<%= raw @page.rendered_content %>
重要安全提醒
⚠️ 一定要注意:如果这个content字段允许普通用户输入内容,绝对不能用这种方法!因为恶意用户可以提交包含恶意Ruby代码的ERB,直接在你的服务器上执行,这会导致严重的安全漏洞。
如果是你自己维护的内容(没有用户输入),那这么做没问题;如果涉及用户输入,建议改用静态HTML或者Markdown(用redcarpet之类的库转成HTML),绝对不要解析用户提交的ERB代码。
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

