Recogiendo un array con í­ndices desde un form en RoR

25 de Enero, 2007 — Ruby on Rails

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 »

  1. ¿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?

    Comentario por palmax — 13 de Marzo, 2008 @ 1:14
  2. 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 ] } %>

    Comentario por Emili — 13 de Marzo, 2008 @ 4:20

Redifusión RSS de los comentarios de la entrada.

Deje un comentario

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License. | Emili Parreño