我想从数据库中输出一些代码。
我创建了一个包含Page
和title
列的表content
。在content
中,我为表单添加了代码。我试图在视图中输出它。
<%= form_for :article do |f| %>
<div class="form-group">
<%= f.label :title, "Title" %>
<%= f.text_field :title, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :price, "Price" %>
<%= f.number_field :price, value: 1, class: 'form-control', min: 1 %>
</div>
<div class="form-group">
<%= f.label :stock, "Stock" %>
<%= f.number_field :stock, value: 1, class: 'form-control', min: 1 %>
</div>
<div class="form-group">
<%= f.file_field :image %>
</div>
<%= f.submit "Save", class: 'btn btn-success' %>
<% end %>
在我看来,我有:
<% @pages.each do |page| %>
<%= raw ERB.new(page.content).result(binding) %>
<% end %>
我收到了一个错误:
(erb):1: syntax error, unexpected ')' t(( form_for :article do |f| ).to_s); _erbout.concat "\r\n<d ^ (erb):22: syntax error, unexpected keyword_end, expecting ')' ; end ; _erbout.force_encoding(__EN ^ (erb):22: syntax error, unexpected end-of-input, expecting ')' t.force_encoding(__ENCODING__) ^
我坚持这个错误。我假设错误在ERB中,但我不知道如何解决它。如果你帮助我会很好。
答案 0 :(得分:3)
http://timelessrepo.com/block-helpers-in-rails3谈到这个:
<%= box do %>
根本不是有效的ERB。虽然没有书面规范 对于再培训局而言,每项执行ERB都有一些基本规则 可以跟着。第一条规则是
<%= =%>
中的表达式必须是完整的 表达。完整的表达式是您可以使用的表达式 直接传递到eval而不会出现语法错误。或者你可以 说它是一段Ruby代码,你可以放置括号 周围,它仍然最终成为有效的Ruby:eval("f.text_field") # => Works fine ( f.text_field ) # => Valid eval("box do") # => SyntaxError ( box do ) # => Invalid
另一方面,
<% %>
中的表达式只需要是a 子表达式。子表达式本身就是一种表达式 表达式无效,但如果有另一个子表达式则变为有效 低于或高于它完成它。你也可以说它是一个 一段Ruby代码,你可以放置分号:eval("box do") # => SyntaxError ; box do ; # => Valid (as long as there is an `end` later)
如您所见,
box do
是一个 子表达式,但不是完整的表达式。因此,在正常情况下 ERB,您可以将其放在<% %>
内,但不能放在<%= %>
。
事实上,如果你进入你的ERB.new(page.content)对象,你会看到它开始尝试这样做:
#coding:UTF-8
_erbout = '';
_erbout.concat(( form_for :article do |f| ).to_s);
所以它抱怨,因为它不知道如何单独评估表达式form_for :article do |f|
。
Rails在幕后进行特殊处理,以便在自己渲染时使这些工作正常,但它不是来自ERB的东西。