以下代码:
<div id="vote_form">
<%= form_remote_tag :url => story_votes_path(@story) do %>
<%= submit_tag 'shove it' %>
<% end %>
</div>
给出了编译错误
如果将第一个 <%=
替换为<%
,那么一切正常。我认为它们只是“show”或“not show”不同,但为什么它会导致编译错误?
错误是:
> 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 ')'
答案 0 :(得分:2)
您会在错误消息中看到它。使用<%= ... %>
时,erb会将此替换为(...)。to_s。当do
后面跟着一个关闭的paranthesis时,Ruby会感到困惑,它会改为某种块。
答案 1 :(得分:1)
查看this
当您使用form_tag时,它会调用FormHelper类的form_tag方法。这个帮助器方法返回html取决于你的代码。
# 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
从这里你会发现Complier期待阻止它并且当它没有得到它时它会发生错误。
答案 2 :(得分:0)
这实际上是3个Rails版本在ERB模板中处理Ruby块之前的不一致。因为form_for
帮助器将HTML form
元素插入到内容的视图中,所以它应该在其ERB标记中使用等号,并且Rails 3修复了这一点。