ruby on rails - ¿Cómo ejecuto varias líneas de Ruby en el archivo html.erb?
ruby-on-rails block (3)
No es habitual definir un método en un archivo ERB, por lo que lo recomiendo.
Si desea llamar a un bloque como #each
, puede hacer algo como lo siguiente:
<% names.each do |name| %>
<%= name %>
<% end %>
No olvides el <% end %>
.
Estoy usando Ruby on Rails y necesito ejecutar un bloque de código Ruby en uno de mis archivos html.erb. ¿Lo hago así?
<% def name %>
<% name = username %>
<%= name %>
o así:
<% def name
name = username %>
<%= name %>
Gracias por leer.
Puedo imaginar a alguien que lo necesite en una plantilla 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, puede ser fácilmente abusado (código ilegible).
<% def f1(a, b, c) %>
test: <%= a %>, <%= b %>, <%= c %>
<% end %>
<% f1(1, 2, 3) %>
<% f1(4, 5, 6) %>
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 un people_helper.rb
, y debería tener este aspecto
module PeopleHelper
def name
#do something
username
end
end
Otra alternativa muy limpia es usar el pattern Presenter , pero creo que es menos común (desafortunadamente).
De lo contrario, si necesita varias líneas de código ruby dentro de 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í, la sangría de código es más importante que la sangría html, así que 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 diferentes opiniones al respecto.