9
<div class='row'>
  <%= form.field_container :name do %>
    <%= form.label :name, raw('Name' + content_tag(:span, ' *', :class => 'required')) %>
    <%= form.text_field :name, :class => 'fullwidth' %>
    <%= form.error_message_on :name %>
  <% end %>
</div>

これにより次のエラーが発生するのはなぜですか?

$ erb -x -T - test.erb | ruby -c
-:3: syntax error, unexpected ')'
...form.field_container :name do ).to_s); _erbout.concat "\n"
...                               ^
-:9: syntax error, unexpected $end, expecting ')'
4

2 に答える 2

16

によって出力されたコードを見ると、次のようになりますerb -x -T - test.erb

#coding:ASCII-8BIT
_erbout = ''; _erbout.concat "<div class='row'>\n  "
; _erbout.concat(( form.field_container :name do ).to_s); _erbout.concat "\n"
; _erbout.concat "    "; _erbout.concat(( form.label :name, raw('Name' + content_tag(:span, ' *', :class => 'required')) ).to_s); _erbout.concat "\n"
; _erbout.concat "    "; _erbout.concat(( form.text_field :name, :class => 'fullwidth' ).to_s); _erbout.concat "\n"
; _erbout.concat "    "; _erbout.concat(( form.error_message_on :name ).to_s); _erbout.concat "\n"
; _erbout.concat "  ";  end ; _erbout.concat "\n"
; _erbout.concat "</div>\n"
; _erbout.force_encoding(__ENCODING__)

do3 行目で、 a の後に aが続くことがわかります)。Ruby はdo…<code>end ブロックを想定していますが、閉じ括弧を取得しています。それが構文エラーの直接の原因です。

erb悪いコードを出力する理由は、使用<%=すべきときに を使用しているため<%です。コードを次のように変更すると、構文エラーが修正されます。

<div class='row'>
  <% form.field_container :name do %>
    <%= form.label :name, raw('Name' + content_tag(:span, ' *', :class => 'required')) %>
    <%= form.text_field :name, :class => 'fullwidth' %>
    <%= form.error_message_on :name %>
  <% end %>
</div>

このコードを実行して、変更後に必要なものが出力されるかどうかをテストすることはできませんが、によって生成されたコードはerb機能するように見えます。

#coding:ASCII-8BIT
_erbout = ''; _erbout.concat "<div class='row'>\n  "
;  form.field_container :name do ; _erbout.concat "\n"
; _erbout.concat "    "; _erbout.concat(( form.label :name, raw('Name' + content_tag(:span, ' *', :class => 'required')) ).to_s); _erbout.concat "\n"
# more...

編集

この解決策は明らかに出力を壊すので、私はmu が短すぎる提案を調べました。Rails 3 がデフォルトで使用するErubisERB と異なる動作をするかどうかを確認しました。によって出力されたコード(元の編集されていないもの):erubis -x -T - test.erbtest.erb

_buf = ''; _buf << '<div class=\'row\'>
  '; _buf << ( form.field_container :name do ).to_s; _buf << '
'; _buf << '    '; _buf << ( form.label :name, raw('Name' + content_tag(:span, ' *', :class => 'required')) ).to_s; _buf << '
'; _buf << '    '; _buf << ( form.text_field :name, :class => 'fullwidth' ).to_s; _buf << '
'; _buf << '    '; _buf << ( form.error_message_on :name ).to_s; _buf << '
';   end 
 _buf << '</div>
';
_buf.to_s

3 行目にはまったく同じ問題がありerubis -x -T - test.erb | ruby -c、同じ構文エラーが出力されます。したがって、ERB と Erubis の違いはおそらく問題ではありません。

また、Rails の公式ドキュメントからこのコードを構文チェックしてみました。

<%= form_for(zone) do |f| %>
  <p>
    <b>Zone name</b><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.submit %>
  </p>
<% end %>

同じ構文エラーが発生します。したがって、ERB コードの書き方が悪いわけではありません。あなたのコードはその例と非常に似ています。

現時点では、ERB テンプレートを直接評価するのではなく、Ruby コードに変換するerbのフラグに欠陥があり、サポートすべきいくつかの機能をサポートしていないというのが私の推測です。-x今考えると、自分自身がテキストを出力するブロックの結果を出力するときに、Rubyコードを出力するときに、どのようなRubyコードを出力すればよいのか想像がつきません。各出力をいつ書き込む必要がありますか? 結果が最初か、ブロックの内容が最初か?

于 2013-06-28T22:11:36.427 に答える