Lucas Sallovitz wrote:
2008/6/25 Eduardo Trápani <[EMAIL PROTECTED]>:
<table>
<% for i in [
{:label => 'Fecha',:field => 'date'},
{:label => 'Contratista',:field => 'contratista.nombre'},
{:label => 'Desde',:field => :desde},
{:label => 'Hasta',:field => :hasta},
{:label => 'Monto',:field => :amount}
] %>
<tr>
<th><%= i[:label] %></th><td class="sinborde"><%= @contrato.send(i[:field])
%></td>
</tr>
<% end %>
</table>


Las primeras versiones del generate scaffold hacían algo parecido con un

<% for field in @contrato.attributes %>
<tr>
  <th><%= field.name %></th>
  <td class="sinborde"><%= h field.value %></td>
</tr>
<% end %>

Ojo que estoy inventado y no se si falta algún detalle, en particular
se me ocurre que no siempre querés mostrar todos los atributos, en ese
caso haría un método contrato#atributos_mostrables que devuelva la
lista, o en todo caso en el mismo for le agregás un .reject o .select
de acuerdo a lo que necesites:

<% for field in @contrato.attributes.select { |a|
['campo1','campo2','campo3'].includes? a.name %>
<tr>
  <th><%= field.name %></th>
  <td class="sinborde"><%= h field.value %></td>
</tr>
<% end %>

El comentario sobre CSS2 aplica de todas formas, podes estilear todas
las td con .contenedor td

Saludos. Lucas.
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
Correcto, lo del scaffold que comentas se hace usando el column_names, y quedaría de la siguiente manera:

<% for aircraft in @aircraft %>
 <tr>
 <% for column in Aircraft.content_columns %>
   <td><%=h aircraft.send(column.name) %></td>
 <% end %>
   <td><%= link_to 'Show', :action => 'show', :id => aircraft %></td>
   <td><%= link_to 'Edit', :action => 'edit', :id => aircraft %></td>
<td><%= link_to 'Destroy', { :action => 'destroy', :id => aircraft }, :confirm => 'Are you sure?', :method => :post %></td>
 </tr>
<% end %>
</table>

Sin embargo, Eduardo, si solo queres mostrar algunos de los campos de la DB yo no pondría esa lógica en la vista. Podes usar el atributo ":select" del find(), cuya documentación reza:

":select - By default, this is "*" as in "SELECT * FROM", but can be changed if you, for example, want to do a join but not include the joined columns."

Es DRY, te queda más limpia la vista, más limpio el controlador, y la query es óptima. El día que necesites mostrar un campo más, lo agregas a tu :select y listo.

Pegale un vistazo: http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001295

Salud y belleza para todos,
Mauro.
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a