posteo a continuación un pequeño ejemplo para crear desde cero una pequeña y simple agenda en Rails utilizando ActiveScaffold. Debido a incompatibilidades entre Rails Edge y ActiveScaffold, recomiendo usar Rails 2.0.x para construir el ejemplo. Sugiero ver el demo online de ActiveScaffold para ver su funcionamiento.
Este ejemplo lo desarrollé con fines didácticos y no contempla validaciones, callbacks y utiliza unicamente asociaciones "uno a muchos".
Las tablas utilizadas son:
contacts
phones
phones
emails
addresses
creamos el proyecto
rails -d mysql contacts
creamos los modelos
script/generate Model Contact lastName:string firstName:string script/generate Model Phone phone:string contact_id:integer script/generate Model Email email:string contact_id:integer script/generate Model Address address:string contact_id:integer
editamos /contact/config/database.yml
development: adapter: mysql encoding: utf8 database: contacts_development username: root password: host: localhost test: adapter: mysql encoding: utf8 database: contacts_test username: root password: host: localhost production: adapter: mysql encoding: utf8 database: contacts_production username: root password: host: localhost
rake db:create
rake db:migrate
/contact/app/models/contact.rb
class Contact < ActiveRecord::Base has_many :phones has_many :addresses has_many :emails end
Noten la pluralización en :phones, :addresses y :emails. Esto se hace así debido a que el método has_many apunta a "muchos". Si no se contempla esta convención, se obtiene un error de SQL al intentar construir una sentencia con una columna inexistente.
/contact/app/models/phone.rb
class Phone < ActiveRecord::Base belongs_to :contact end
class Address < ActiveRecord::Base belongs_to :contact end
class Email < ActiveRecord::Base belongs_to :contact end
despues, descomprimimos la carpeta contenida en el zip en
/contact/vendor/plugin/
Ahora generamos los controllers
script/generate controller Contact script/generate controller Phone script/generate controller Email script/generate controller Address
dentro de application.html.erb incluimos esto:
/contact/app/views/layouts/application.html.erb
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html;. charset=iso-8859-1" /> <meta http-equiv="Content-Language" content="en-us" /> <title>Agenda simple</title> <div class="codeblock"><code><font color="#000000"><font color="#0000BB"><?php<br /></font><font color="#007700">= </font><font color="#0000BB">javascript_include_tag </font><font color="#007700">:</font><font color="#0000BB">defaults <br />?></font></font></code></div> <div class="codeblock"><code><font color="#000000"><font color="#0000BB"><?php<br /></font><font color="#007700">= </font><font color="#0000BB">active_scaffold_includes <br />?></font></font></code></div> </head> <body id="library"> < <h1>Agenda simple</h1> <h3>powered by Ruby on Rails</h3> <div id="content"> <div class="codeblock"><code><font color="#000000"><font color="#0000BB"><?php<br /></font><font color="#007700">= </font><font color="#0000BB">yield </font><font color="#007700">-<br /></font><font color="#0000BB">?></font></font></code></div> </div> <div id="sidebar"></div> </body> </html>
En este código, la magia la generan estas dos lineas, que incluyen a ActiveScaffold al proyecto:
<%= javascript_include_tag :defaults %>
<%= active_scaffold_includes %>
y en el contact_controller.rb agregamos
active_scaffold :<your_model_name>
en nuestro caso
/contact/app/models/contact.rb
class ContactController < ApplicationController active_scaffold :contact end
Si llegásemos a ver que en vez de obtener un dato a partir de las asociaciones, apareciese algo similar a esto: #
entonces debemos editar el modelo afectado y crear un método que establezca el valor correctamente. Tomemos por ejemplo el modelo Address:
donde "#{address}" contiene a address, atributo del modelo Address. Lo que aquí se realiza es una evaluación de lo contenido en las comillas dobles. En dicha evaluación, Ruby realiza una interpolación debido a que encuentra la orden para hacerla (#{}) y devuelve el valor contenido en address en esa instancia.
Grabamos y refrescamos en browser y el problema habrá desaparecido. Cuando ActiveScaffold llama al método to_label para el modelo evaluado, encuentra este override y lo ejecuta, retornando el valor que deseamos.
La misma definición la deberíamos realizar en todos los otros modelos afectados.
En otro post próximo exploraremos las posibilidades parametrización de ActiveScaffold. Espero que les sea de utilidad.
Comentarios recientes
44 weeks 2 days ago
46 weeks 3 hours ago
1 año 26 weeks ago
1 año 28 weeks ago
1 año 41 weeks ago
1 año 45 weeks ago
1 año 51 weeks ago
1 año 51 weeks ago
1 año 51 weeks ago
2 years 1 día ago