1

次のコード:

<div id="vote_form">
  <%= form_remote_tag :url => story_votes_path(@story) do %>
    <%= submit_tag 'shove it' %>
  <% end %>
</div>

コンパイルエラーを与える

一方、最初の <%=ものを に置き換えると<%、すべてが機能します。「表示する」か「表示しない」だけの違いだと思っていたのですが、実際にコンパイルエラーになるのはなぜでしょうか?

エラーは次のとおりです。

> SyntaxError in Stories#show
> 
> Showing
> app/views/stories/show.html.erb where
> line #17 raised:
> 
> compile error C:/Software
> Projects/ror/shov12/app/views/stories/show.html.erb:17:
> syntax error, unexpected ')' ...
> story_votes_path(@story) do ).to_s);
> @output_buffer.concat ...
>                               ^ C:/Software
> Projects/ror/shov12/app/views/stories/show.html.erb:23:
> syntax error, unexpected kENSURE,
> expecting ')' C:/Software
> Projects/ror/shov12/app/views/stories/show.html.erb:25:
> syntax error, unexpected kEND,
> expecting ')'
4

3 に答える 3

2

エラーメッセージに表示されます。erb を使用する場合<%= ... %>、これは (...).to_s に置き換えられます。a の後に閉じ括弧が続くと、Ruby は混乱しdoます。代わりに、ある種のブロックを期待します。

于 2010-05-24T09:53:24.287 に答える
1

これを見てください

form_tag を使用している場合は、FormHelper クラスの form_tag メソッドを呼び出します。このヘルパー メソッドは、コードに依存する s を返します。

     # File vendor/rails/actionpack/lib/action_view/helpers/prototype_helper.rb, line 331
331:       def form_remote_tag(options = {}, &block)
332:         options[:form] = true
333: 
334:         options[:html] ||= {}
335:         options[:html][:onsubmit] =
336:           (options[:html][:onsubmit] ? options[:html][:onsubmit] + "; " : "") +
337:           "#{remote_function(options)}; return false;"
338: 
339:         form_tag(options[:html].delete(:action) || url_for(options[:url]), options[:html], &block)
340:       end

このことから、コンパイラがブロックを期待しており、それを取得できなかった場合にエラーが発生することがわかります。

于 2010-05-24T10:00:32.850 に答える
0

これは実際には、Rails の 3 より前のバージョンが ERB テンプレート内で Ruby ブロックを処理する方法に一貫性がありませんでした。form_forヘルパーはビューのコンテンツの周囲に HTML 要素を挿入するため、formERB タグで等号を使用する必要があり、Rails 3 ではこれが修正されています。

于 2010-05-24T09:56:43.567 に答える