为什么ERB出现此错误?

时间:2018-04-02 08:48:47

标签: ruby-on-rails ruby

我想从数据库中输出一些代码。

我创建了一个包含Pagetitle列的表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中,但我不知道如何解决它。如果你帮助我会很好。

1 个答案:

答案 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的东西。

(类似问题:Why is this an error with ERB?