В Ruby on Rails <% = или <% должны иметь значение только для шоу или без шоу, но почему это даст ошибку компиляции? - PullRequest
1 голос
/ 24 мая 2010

следующий код:

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

выдает ошибку компиляции

если вместо first <%= указать <%, то все работает. Я думал, что они отличаются только «показать» или «не показать», но почему это на самом деле приведет к ошибке компиляции?

Ошибка:

> 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 ]

2 голосов
/ 24 мая 2010

Вы видите это в своем сообщении об ошибке.При использовании <%= ... %> erb заменит это на (...). To_s.Руби запутывается, когда за do следует закрывающий парантез, вместо этого он ожидает какой-то блок.

1 голос
/ 24 мая 2010

Взгляните на это

когда вы используете form_tag, он вызывает метод form_tag класса FormHelper. Этот вспомогательный метод возвращает 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 ожидает и выдает ошибку, когда не получил его.

0 голосов
/ 24 мая 2010

Это на самом деле противоречие в том, как версии Rails до 3 обрабатывали блоки Ruby в шаблонах ERB. Поскольку помощник form_for вставляет элемент HTML form в представление вокруг содержимого, он должен был использовать знак равенства в своих тегах ERB, а Rails 3 исправляет это.

...