Emili Parreño

Recogiendo un array con índices desde un form en RoR

25 Jan 2007 |

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