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





