2010-06-23 25 views
22

Estoy usando Ruby on Rails y necesito ejecutar un bloque de código de Ruby en uno de mis archivos html.erb. Lo hago de esta manera:Cómo ejecuto varias líneas de Ruby en el archivo html.erb

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

o como esto:

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

Gracias por leer.

+0

¿Por qué intenta crear una función en una vista? Lo más probable es que entre en el modelo, o si no en el controlador, pero definitivamente no en la vista – jigfox

+0

Disculpa, simplemente escribí un código aquí como un ejemplo. – ben

Respuesta

22

Es inusual definir un método en un archivo ERB, por lo que recomiendo que no lo haga.

Si desea llamar a un bloque como #each, se puede hacer algo como lo siguiente:

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

no se olvide el <% end %>.

+2

y olvidaste '|' después de '| name' ;-) – jigfox

34

Si necesita funciones adicionales en su vista, normalmente las declara dentro de un ayudante.

Para cada controlador, si hay un ayudante, se carga automáticamente. Por ejemplo, si tiene un PeopleController, en la carpeta app/helpers, debería haber una people_helper.rb, y debería tener este aspecto

module PeopleHelper 
    def name 
    #do something 
    username 
    end 
end 

Otra alternativa, muy limpio, es utilizar el Presenterpattern, pero creo que es es menos común (por desgracia).

De lo contrario, si necesita varias líneas de código de rubí en el interior una vista erb, que trato de evitar, prefiero el siguiente estilo:

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

también para mí código de sangrado es más importante que la muesca html , entonces preferiré algo como

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

Pero siempre estoy muy interesado en escuchar opiniones diferentes en este asunto.

+3

Los métodos de ayuda son el camino a seguir, seguro. – tadman

-1

Me imagino a alguien que lo necesita en una plantilla en particular (no tiene sentido crear un ayudante) para no duplicar el marcado HTML. Es decir, cuando la página html resultante tiene un par de bloques similares de marcado HTML. Sin embargo, se puede abusar fácilmente (código ilegible).

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

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

esto no parece funcionar para mí https://i.imgur.com/oWOu5v8.png – barlop

+0

su respuesta no funciona, todo lo que hace es poner los contenidos de la función en una página web, tratándola como HTML no como rieles o código ruby ​​https://i.imgur.com/rhTNtt5.png – barlop

+0

@barlop Disculpe por no haber colaborado. Mira mi respuesta. Eso funciona para ti? Eso es probablemente lo que quise decir. –

Cuestiones relacionadas