2010-06-23 7 views
22

Sto usando Ruby on Rails e ho bisogno di eseguire un blocco di codice Ruby in uno dei miei file html.erb. Faccio in questo modo:Come eseguire più righe di Ruby nel file html.erb

<% def name %> 
<% name = username %> 
<%= name %> 

o come questo:

<% def name 
name = username %> 
<%= name %> 

Grazie per la lettura.

+0

Perché stai cercando di creare una funzione in una vista? Appartiene molto probabilmente nel modello, o se non nel controller, ma sicuramente non nella vista – jigfox

+0

Scusa, ho appena digitato un po 'di codice lì dentro come esempio. – ben

risposta

22

È insolito definire un metodo in un file ERB, quindi consiglio di non farlo.

Se si desidera chiamare un blocco come #each, si può fare qualcosa di simile al seguente:

<% names.each do |name| %> 
    <%= name %> 
<% end %> 

non dimenticare il <% end %>.

+2

e hai dimenticato un '|' dopo '| name' ;-) – jigfox

34

Se hai bisogno di funzioni extra nella tua vista, di solito dichiari quelle all'interno di un helper.

Per ogni controller, se è presente un helper viene caricato automaticamente. Per esempio, se avete un PeopleController, nella cartella app/helpers, ci dovrebbe essere un people_helper.rb, e dovrebbe assomigliare a questo

module PeopleHelper 
    def name 
    #do something 
    username 
    end 
end 

altro, alternativa molto pulito, è quello di utilizzare il Presenterpattern, ma penso che sia è meno comune (purtroppo).

In caso contrario, se si ha bisogno di più righe di codice Ruby all'interno di una vista Erb, che cerco di evitare, preferisco il seguente stile:

<% 
    counter_1 = 0 
    counter_2 = 1 
    do_some_more_prep_here 
%> 
<% @records.each do |rec|%> 
    <%# do something with the prepped date in each row %> 
<% end %> 

Anche per me indentazione del codice è più importante di html indentazione , quindi preferirò qualcosa come

<table> 
    <% @rows.each do |row| %> 
    <tr> 
     <td><%= row.item1 %></td> 
     <% if row.some_test %> 
     <td><%= row.item2 %></td> 
     <% end %> 
    </tr> 
    <% end %> 
</table> 

Ma sono sempre molto interessato a sentire opinioni diverse in questa materia.

+3

I metodi di supporto sono la strada da percorrere, certo. – tadman

-1

Posso immaginare che qualcuno ne abbia bisogno in un modello particolare (non serve creare un helper) per non duplicare il markup html. Cioè, quando la pagina html risultante ha un paio di blocchi simili di markup html. Tuttavia, può essere facilmente abusato (codice illeggibile).

<% def f1(a, b, c) %> 
    test: <%= a %>, <%= b %>, <%= c %> 
<% end %> 

<% f1(1, 2, 3) %> 
<% f1(4, 5, 6) %> 
+0

questo non sembra funzionare per me https://i.imgur.com/oWOu5v8.png – barlop

+0

la tua risposta non funziona, tutto ciò che sta facendo è mettere il contenuto della funzione su una pagina web, trattandolo come HTML non come rails o codice ruby ​​https://i.imgur.com/rhTNtt5.png – barlop

+0

@barlop Ci scusiamo per non essere stati elaborati. Controlla la mia risposta. Funziona per te? Questo è probabilmente quello che intendevo. –