2010-05-24 9 views
1

Le code suivant:Sur Ruby on Rails, <% = ou <% ne devrait avoir d'importance que si c'est show ou no show, mais pourquoi donnera-t-il une erreur de compilation?

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

donne erreur de compilation

alors que si le premier <%= est remplacé par <%, alors tout fonctionne. Je pensais qu'ils ne diffèrent que par "montrer" ou "ne pas montrer", mais pourquoi cela provoquera-t-il réellement une erreur de compilation?

L'erreur est:

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

Répondre

2

Vous voyez dans votre message d'erreur. Lors de l'utilisation <%= ... %> erb remplacera cela par (...). To_s. Ruby devient confus quand un do est suivi d'une parenthèse de fermeture, il attend un bloc de quelque sorte à la place.

0

Il s'agit en fait d'une incohérence dans la façon dont les versions de Rails antérieures à 3 géraient les blocs Ruby dans les modèles ERB. Parce que l'aide form_for insère un élément HTML form dans la vue autour du contenu, il aurait dû utiliser un signe égal dans ses balises ERB et Rails 3 corrige cela.

1

Jetez un oeil à this

lorsque vous utilisez form_tag il appelle la méthode form_tag de FormHelper classe. Cette méthode d'aide renvoie le html en fonction de votre code.

 # 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 

De cela, vous arriverez à savoir que le bloc attend Complier et thows erreur quand il n'a pas compris.