View posts for » Category "rubyonrails"

Termino la RailsRumble

railsrumble.jpg

Casi casi participo de la RailsRumble con Rodrigo Orrego, pero finalmente ambos nos echamos para atrás por tiempo. Han surgido iniciativas super interesantes …. casi 90 equipos, 90 nuevas iniciativas veamos que salio… no voy a revisar las 90 iniciativas pero si las que más me llamen la atención. Uh me eche para atrás son muchas!!

Recordar que estas 90 iniciativas fueron desarrolladas en 48 horas, todas en Rubyo on Rails y desde mañana te podrás registrar en el sitio para votar por las que más te llamen la atención.

Link | Las 90 iniciativas de la RailsRumble

Comments (0)

Creando plugins en Rails

La mejor forma de ayudar a la comunidad es desarrollando plugins y gemas. Muchos creíamos o creemos que generar plugins ayuda a la comunidad pero nos olvidamos que también nos ayuda a nosotros. En una conversación con Ismael descubrí el gran beneficio de generar plugins.

Por ejemplo hace un tiempo atrás integre flickr con una aplicación y tengo todo el código generado, ahora.. me da flojera integrarlo de nuevo. Si hubiese generado un plugin quizás ahora me ahorraría el doble trabajo.

A través de los megamaestros de RubyInside descubrí un articulo de Alex Young en donde no solo te cuenta como hacer tus propios plugins sino también la “mejor” forma de hacerlo, los patrones que debes seguir y como siempre en Rails, sacando lo mejor de ti como desarrollador.

Nota: No olviden que tu problema no sólo lo tienes tú. Isamel desarrollo un plugin notable, que justamente era un problema que yo habia tenido… y habia sido bastante poco Railero para solucionarlo. Lo que he ido aprendiendo es que con Rails poco tiempo te vas haciendo un mejor desarrollador, Ismael ya lo sabe.

Revisenlo!

Link | A taxonomy of Rails plugins (via RubyInside)

Comments (5)

ActiveRecord tip: Contar elementos asociados con has_many

Mirando la presentación de Gregg Pollack en el Orlando Ruby User Group saque algunos tips que no conocia, porque en realidad no lo habia neceistado… pero que nunca viene mal saber.

Has_many, contar recursos asociados.

En mi caso tengo una clase forum.rb (has_many :topics) y topic.rb (belongs_to :forum) y lo que quiero hacer es saber cuantos topics tiene el forum x.

Es muy simple, pero no olvides darle el default = 0 porque las operaciones que hace son matematicas del tipo +1 y -1 lo que hace imposible sumarle 1 a NULL si no se especifica el default.


def self.up
add_column :forums, :topics_count, :integer, :default => 0
end

y finalmente en el modelo topics


belongs_to :forum, :counter_cache => true

Luego para obtener la cantidad de topics asociados a un foro:


Forum.find(:first).topics.size

Con lo anterior evitamos 1 query a la base de datos lo que es considerable si estamos en un loop.

Nota: Al final de la presentación de Gregg un pequeño howto de acts_as_taggable
Link | Gregg Pollack en el Ruby User Group

Comments (1)

Pensamiento: Seguir convenciones

Esta noche trabajando en nuestro CMS, senti en carne propia la felicidad de un railero. Ocupe en un modelo:


def to_param
"#{id}-#{permalink}"
end

Y como había sido obediente, ocupando por todos lados la rutas generadas por map.resources. Fue lo único que tuve que tocar para cambiar URL en todos los links de mi app.

El que sabe, sabe. El que no… no conoce Rails.

Comments (0)

Recursos anidados en Rails

Los recursos anidados son una de las cosas que mas me gustan de trabajar con REST en Rails y es básicamente la forma de generar rutas mas amistosas de una manera mucho mas rapida asociando los modelos, usando esta forma se crea un lazo inseparable entre el padre y sus hijos.

El efecto lo puedes lograr tu mismo iterando sobre el contenido de los modelos, modificando las rutas, pero el problema es que pierdes el acceso REST a los controladores o al menos se te haga muy muy enredado.

Recuerda, Rails es acerca de convenciones, cuando las sigues te convertirás en uno de los miles de programadores felices, si no… mejor no uses Rails (Obviamente, en ocasiones romper las convenciones ayuda, solo no lo hagas cuando no sea necesario).

Pero como lo implemento


map.resources :branches, :path_prefix => '/admin' do |branches|
branches.resources : orders
end

2do, tienes que agregar las asociaciones

En app/model/branch.rb

has_many : orders # Ojo con las convenciones, has_many :plural

En app/model/order.rb

belongs_to : banch # Ojo con las convenciones, belongs_to :singular (lógico!, se lee!)

3ero. Tenemos que retocar los controladores, para que sepa donde buscar a los hijos.
En este caso app/controllers/orders.rb

class OrdersController < ApplicationController
before_filter : load_branch

# GET /orders
# GET /orders.xml
def index
@orders = @branch.orders.find(:all).reverse

respond_to do |format|
format.html # index.rhtml
format.xml { render : xml => @orders.to_xml }
end
end

# GET /orders/1
# GET /orders/1.xml
def show
@order = @branch.orders.find(params[:id])
@lines = @branch.types

respond_to do |format|
format.html # show.rhtml
format.xml { render : xml => @order.to_xml }
end
end

# GET /orders/new
def new
@order = Order.new
end

# GET /orders/1;edit
def edit
@order = @branch.orders.find(params[:id])
end

# POST /orders
# POST /orders.xml
def create
@order = Order.new(params[:order])

respond_to do |format|
if @order.save
flash[: notice] = ‘Order was successfully created.’
format.html { redirect_to order_url(@branch,@order) }
format.xml { head : created, :location => order_url(@branch,@order) }
else
format.html { render : action => “new” }
format.xml { render : xml => @order.errors.to_xml }
end
end
end

# PUT /orders/1
# PUT /orders/1.xml
def update
@order = @branch.orders.find(params[:id])

respond_to do |format|
if @order.update_attributes(params[:order])
flash[:notice] = ‘Order was successfully updated.’
format.html { redirect_to order_url(@branch,@order) }
format.xml { head : ok }
else
format.html { render :action => “edit” }
format.xml { render : xml => @order.errors.to_xml }
end
end
end

# DELETE /orders/1
# DELETE /orders/1.xml
def destroy
@order = @branch.orders.find(params[:id])
@order.destroy

respond_to do |format|
format.html { redirect_to orders_url }
format.xml { head : ok }
end
end

# Notar como obtengo al papa de las ordenes
def load_branch
@branch = Branch.find params[:branch_id]
end
end

Notar en el código de arriba, como llamo a el padre (before_filter) de en este caso las ordenes, y como genero sus rutas (order_url(@branch,@order))

Lo que automáticamente te genera por ejemplo, las siguientes rutas:

/branches (Lista de sucursales)
/branches/1 (Muestra sucursal 1)
/branches/1;edit (Editas sucursal 1)
/branches/1/orders (Lista de ordenes para la sucursal 1)
/branches/1/orders/1;edit (Editas la orden 1 de la sucursal 1)

ups, pero estoy ocupando path_prefix asi que en realidad quedaría:

(Esta opción es completamente opcional y no recomendada (Es preferible tener una sola interfaz para todo, al menos algunos lo creen así… yo no mucho, aunque creo depende del tipo de proyecto.)

/admin/branches (Lista de sucursales)
/admin/branches/1 (Muestra sucursal 1)
/admin/branches/1;edit (Editas sucursal 1)
/admin/branches/1/orders (Lista de ordenes para la sucursal 1)
/admin/branches/1/orders/1;edit (Editas la orden 1 de la sucursal 1)

Se puede jugar un poco mas….

Aunque lo dejo a tu discreción


map.resources :branches, :path_prefix => '/admin' do |branches|
branches.resources : orders do |orders|
orders.resources :line_items
end
end

Nota: Para este ejemplo ocupe scaffold_resource para generar todo el código, si ustedes también lo hacen podrán verlo funcionando de inmediato.

Nota 2: Lamento lo difícil que es leer código en mi blog, lo tengo como uno de los principales puntos del porque quiero re diseñar mi sitio, pero igualmente espero ayudarlos (ojo: Hay muchos dos puntos ( : ) que separo para no generar emoticons, recuerden es :variable)

Comments (4)

Tractis Dentro de las 31 start-ups más prometedoras de Mundo (Business 2.0)

cnnmoney20.png

Business2.0 posiciono a Tractis como una de la 31 Start-up mas prometedoras del mundo (Fuera de Estados Unidos) y la única española.

Tractis es una empresa con un lema bastante ambiciosos:

Nuestro enemigo es el sistema de justicia transnacional actual.
Es lento, caro, complejo, cerrado, no-interoperable y centralizado.
Es injusto para la mayoría de nosotros y obsoleto en Internet.

En Negonation, queremos crear una alternativa mejor.
Un sistema rápido, barato, simple, abierto, interoperable y descentralizado.
Un sistema justo para la mayoría de nosotros y para la nación Internet.

Es uno de los proyectos mas ambiciosos que conozco y por ser una iniciativa española la he seguido desde que el 24 de Junio de 2006 cuando Diego LaFuente en sus blog (minid.net) nos contará a todos sus lectores que trabaja en esos momentos en una empresa desconocida, un experimento que al entrar me di cuenta ya habia sido finalista y ganadora varios premios entregados por prestigiosas universidades, lo mínimo para que el año pasado le dedicara varias horas entendiendo el proyecto.

David su CEO, es un tipo singular, no solo un tipo muy joven si no que también un viajero, un experto en negociaciones y mas importante un gran tipo. En mi estadía en Madrid el año pasado en la Conferencia Rails 2006 me ayudo en varias cosas y la segunda noche me invito a compartir con parte del equipo que hacen de tractis realidad (Lo mas simpático es que a varios no los conocía en persona), entre ellos Luismi Cavalle un mostro del desarrollo web. No lo conozco en persona, pero para los amantes de Rails, Ernesto Jiménez tambien se encuentra en las filas de Tractis (Que equipo No?).

Según me entero por Enrique Dans, tienen planeada su lanzamiento para Septiembre.

Felicitaciones David y a todo el equipo.

Actualización: David me ha confirmado el lanzamiento para Septiembre (Si todo sale bien) asi que muy atentos.

Comments (0)

Amazon S3: Como implementarlo con Rails? Parte I

railsas3.png
Sistema de archivos del CMS que me encuentro desarrollando

Implementaremos una aplicación en Rails apegado al modelo REST que nos permitirá subir archivos a un Bucket en Amazon S3. Usando algunos plugins también serás capaz de crear thumbnails de tus archivos si estos son imágenes. Debes estar dispuesto a ensuciarte las manos (Digo, como nos gusta a nosotros, que a jardinear ni a palos).

Requisitos

  • Un Computador
  • Tener instalado Rails y sus amigos
  • Crearte una cuenta en AmazonWS y activar S3 (Necesitas Tarjeta de crédito en dolares, buuu si sé, pero no hay otra opción)
  • Desde el Panel de control tomar tu Access_key_id y tu Secret_access_key
  • Al rededor de xx minutos

Creamos la aplicación

En este caso nuestra aplicación se llamará s3 y la base de datos, no olvides modificar el archivo /config/database.yml y poner los valores que correspondan, como no vamos a testear (mi próximo must do TDD, esta primero en la lista)


rails as3

Creamos nuestra base de datos


mysql -u root -p
>> create database s3_dev;
>> exit;

Creamos nuestra primera migración

Vamos a ocupar scaffold_resource, que vendrá a cambiar definitivamente a scaffold en la versión 2.0 de Rails, lo que nos permitirá tener una flamante estructura REST en nuestro controladores (Nuestros 7 famosos métodos) e inmediatamente creamos nuestro modelo.


ruby script/generate scaffold_resource Archive name:string created_at:datetime updated_at:datetime content_type:string filename:string thumbnail:string size:integer width:integer height:integer parent_id:string

Lo que nos genera automáticamente todo lo necesario para tener desde ya nuestra aplicación corriendo y con el plus de ya tener generado nuestra migración del modelo necesario para nuestros archivos.


create_table "archives", :force => true do |t|
t.column "name", :string
t.column "created_at", :datetime
t.column "updated_at", :datetime
t.column "content_type", :string
t.column "filename", :string
t.column "thumbnail", :string
t.column "size", :integer
t.column "width", :integer
t.column "height", :integer
t.column "parent_id", :integer
end

Para terminar solo tenemos que migrar

rake db:migrate

Quiere probar como vas? arranca el servidor y apunta tu navegador a http://localhost:3000/archives

ruby script/server

Si no fuera porque estamos implementando S3, ya puedes decir que has creado tu primera aplicación en Rails (Claro, si nunca lo habias hecho. Para los viejotes ahora viene lo bueno).

Haciendo la magia

En el próximo articulo, instalaremos las gemas y los plugin necesarios para que todo quede funcionando.

Comments (7)

Google SMTP: OpenSSL::SSL::SSLError

Desde el 19 de Julio google hizo algunas modificaciones en como manejan las entradas SSL (Pero aun no logro entender que fue lo que realmente cambiaron) lo que produce que Enviar correos desde apps Rails con Google ahora nos lance un error.

Como restrear un error en Rails

Primero me tiraba la famosa pagina de error de Rails y inmediatamente me dirigí al log de production, que se encuentra en log/production.log y te vas al final y podrás ver claramente el error, que en este caso me arrojaba:

OpenSSL::SSL::SSLError (SSL_read:: wrong version number):

En este caso la solución era simple, porque los correos se seguían enviando y solo que cortaba el correcto flujo de la acción. Para solucionarlo bastaba con agarrar la excepción (try catch para los que vienen de JAVA)

1. Abre el archivo lib/smtp_tls.rb
2. Agrega inmediatamente después de rescue EOFError en el método quit: rescue OpenSSL::SSL::SSLError

Con lo que logras el control de la excepción, sin claro, descubrir cual es la madre del cordero pero al menos tu aplicación sigue funcionando.

Si alguien sabe porque nos lanza esta excepción que nos cuente.

Comments (4)

La pesadilla de la Terminal: bash command not found

Tuve que formatear el Mac por motivos X, y al volver a instalar todo mi arsenal. Decidí esta vez hacerlo a través de Darwin/MacPorts lo que te permite fácilmente instalar paquetes completes al mas puro estilo de linux (apt-get).

El problema era que después de instalar los Ports, comencé a tener problemas en la Terminal abriendo archivos con Textmate y con el comando SVN que ya estaba instalado. No tener el comando mate es tolerable, puedes ocupar nano, pero no tener soporte SVN a través de la consola es fatal, no puedes hacer despliegues con capistrano, bajarte repositorios con algun cliente como el SVN X y entenderán que para un desarrollador Rails es fatal.

No podía encontrar la solución (Quizás solución simple para un linuxero/maquero experimentado, pero recuerden que tengo un pasado oscuro) y después de pegar un par de gritos al cielo, varios minutos y mucho googleo. Encontré la solución y aquí esta, espero a alguien le ayude si se encuentran en este problema.

  • Abre la terminal
  • Dentro de tu usuario, escribe touch .profile [enter]
  • Luego editalo con, nano .profile
  • Finalmente agrega en el bash profile al final de todo: export PATH=$PATH:/usr/local/bin

Cierra la terminal y vuelve a abrir la consola: Tu pesadilla debería haber terminado

Comments (0)

Cuidado con lo que instalas en desarrollo

gems.jpg

Esto es casi una nota/tip mental, un ayuda memoria cuando en producción las cosas fallan.

Muchas veces me veo en la situación de estar trabajando en desarrollo (En mi maquina local) y comenzar a probar nuevos chiches en Rails, especialmente gems y plugins, el problema es que luego de un par de horas trabajando se me termina olvidando que diablos instale y cuando quiero hacer el despliegue al servidor de producción, el servidor desesperado grita que no sabe que hacer. (Errores múltiples)

El consejo para que esto no suceda, es simplemente no cerrar nunca la ventana de la terminal, o cuando terminen:
Terminal > File > Save Text as.. y guardan todo lo que hicieron en un archivo.

De esta manera cuando estén en producción, al menos tendrán donde buscar después de haber instalado un monton de gemas y finalmente INSTALARLAS en producción.

Ahora, alguien tiene una mejor forma de hacer esto? … Se que puedo encontrar las gemes instaladas con gem list, pero habrá alguna forma de hacerlo como se hace con las migraciones, un comando que compare gemas instaladas en producción y desarrollo actuando como corresponda (quizás a través de capistrano?)?.

Comments (4)