2009-09-15 5 views
0

Je m'attendais à voir apparaître le mot "test" dans la sortie une fois et le mot "bonjour" apparaître une fois.erb: la sortie se répète si le modèle contient une définition de méthode

Mais je suis curieux sur le fait que si je fais cela, le mot "test" est affiché deux fois.

<div> 
    <h3>test</h3> 
</div> 

<% def helo %> 
<% "hello" %> 
<% end %> 

<%= helo %> 

Je suppose qu'il y a une explication simple pour cela liée à un peu d'erb?

+0

Si vous examinez le html brut, le test de mot apparaît-il dans un div et un h3? Avez-vous un fichier de mise en page qui peut inclure à nouveau le texte? Pouvez-vous poster la sortie html brute ainsi –

+0

Je ne peux pas expliquer exactement ce qui se passe, mais vous ne devriez pas vraiment le faire. Vous ne contrôlez pas l'objet sur lequel la méthode helo est définie. Vous n'avez pas non plus le contrôle sur la façon dont <%...%> pourrait être traduit en Ruby. Vous appelez donc une méthode inconnue sur un objet inconnu. Il n'est pas surprenant que le résultat soit imprévisible. –

Répondre

1

Je l'ai essayé:

require 'erb' 

template = %q{ 
    <div> 
     <h3>test</h3> 
    </div> 

    <% def helo %> 
     <% "hello" %> 
    <% end %> 

    <%= helo %> 
} 

t = ERB.new(template) 
puts t.result 

#(erb):6:in `helo': undefined local variable or method `_erbout' for main:Object (NameError) from (erb):10 

Il semble donc ce que vous évoquez est juste, mais sur tous les Hows, vous pouvez facilement duper:

require 'erb' 

template = %q{ 
    <div> 
     <h3>test</h3> 
    </div> 

    <% def helo 
     "hello" 
    end %> 

    <%= helo %> 
} 

message = ERB.new(template) 
puts message.result 

Et cela a fonctionné pour moi.

Questions connexes