Recogiendo un array con índices desde un form en RoR
Hoy he tenido que hacer una cosa que hasta ahora no habia hecho antes y creo que puede ser interesante para alguna aplicaciones por ejemplo una cesta de la compra.
Supongamos que tenemos una tabla de Articulos y otra de Colores y las tenemos que relacionar, donde un artÃculos puede tener varios colores.
Creamos una tabla llamada Relaciones y su scaffold. En el modelo definiremos las relaciones con las otras tablas de la siguiente manera
class Relation < ActiveRecord::Base
belongs_to :articles
belongs_to :colours
end
Bien, ahora modificamos el _form.rhtml de Relaciones y lo dejamos de la siguiente manera:
<p><label for=”relation_article_id”>Article</label><br/>
<%= select ‘relation’, ‘article_id’, Article.find_all.collect {|a| [ a.name, a.id ] } %>
</p>
<p>
<label for=”relation_colour_id”>Colors</label><br/>
<% @colours = Colour.find(:all) %>
<% @colours.each do |colour| %>
<%= check_box_tag “colours_list[]”, colour.id %>
<b><%= colour.name%></b> <% end %>
</p>
Lo que estamo haciendo es un select con todos los artÃculos y a continuación creamos una lista de colores con un checkbox al lado. El array colours_list[] almacenará todos los Ãndices (id’s) de los colores que hayamos marcado, tendremos un array parecido a este: colours_list[ ” 3″ => “1″, “7″ => “1″, 19 => “1″].
El método create del controlador quedará como sigue:
def create
@colours = params[:colours_list]
@colours.each do |colour|
@relation = Relation.new(params[:relation])
@relation.colour_id = colour
if @relation.save
else
flash[:notice] = ‘Error: la relación no se ha podido crear.’
redirect_to :action => ‘list’
end
end
flash[:notice] = ‘La relación se ha creado correctamente.’
redirect_to :action => ‘list’
end
2 Comentarios »
Redifusión RSS de los comentarios de la entrada.

¿Y si queremos usar un select para que el usuario seleccione un elemento de un array? ¿Cómo haríamos para recoger el elemento del array elegido, o al menos su posición?
Supongamos que quieres selecionar la categoria de un post (Rails 1.2):
<%= select ‘post’, ‘category_id’, Category.find(:all, :order => “name DESC”).collect {|c| [ c.name, c.id ] } %>
en Rails 2:
<%= f.select ‘category_id’, Category.find(:all, :order => “name DESC”).collect {|c| [ c.name, c.id ] } %>