在Ruby on Rails上,<%=或<%应该只关系它是show还是show show,但为什么会出现编译错误?

时间:2010-05-24 09:45:18

标签: ruby-on-rails view erb

以下代码:

<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 ')'

3 个答案:

答案 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修复了这一点。