Bienvenido(a) a Proyecto Script

Hola!!!

Este es un buen lugar donde buscar las respuestas a tus dudas sobre "Programación", "Lenguajes", "Linux", "Electrónica", etc.

Suele ser difícil buscar en la red y encontrar respuestas claras y en español a muchas preguntas sobre estos temas, así que aquí tienes un buen lugar para iniciar.

Quieres ser parte de esto, solo ¡regístrate!
Mostrando entradas con la etiqueta rails. Mostrar todas las entradas
Mostrando entradas con la etiqueta rails. Mostrar todas las entradas

sábado, 31 de enero de 2009

Error "undefined method `cache_template_loading='"

En Rails 2.2.2 (no tengo conocimiento hasta el momento de publicar esta entrada si en otra versión también ocurre este error), me di cuenta que al ejecutar mi aplicacion en modo de "producción", arrojaba el siguiente error:


1 /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:530:in `send': undefined method `cache_template_loading=' for ActionView::Base:Class (NoMethodError)
2 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:530:in `initialize_framework_settings'
3 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:529:in `each'
4 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:529:in `initialize_framework_settings'
5 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:526:in `each'
6 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:526:in `initialize_framework_settings'
7 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:154:in `process'
8 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:112:in `send'
9 from /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:112:in `run'
10 from /home/neoriddle/etc/rails_apps/miproyecto/config/environment.rb:13

Tomando en cuenta el volcado anterior en la ultima línea visible esta una referencia a la línea número 13 del archivo enviroment.rb, esa línea es la siguiente:


Rails::Initializer.run do |config|

Sabemos que en ejecutar esta línea se carga también el archivo de configuración específico del modo de ejecución (que podría ser "development", "test" o "production"), en mi caso al ejecutar el modo de producción, se generaba el error, de ahí que en la línea 13 del archivo de configuracion del modo produccion tiene lo siguiente:


config.action_view.cache_template_loading = true

Al parecer este método ya no existe en esta versión por lo que una solución es borrar o simplemente comentar esta línea. No estoy seguro si esta sea una solución correcta pero al menos elimina el error el cual no permite que el servicio se ejecute, es decir, el proceso se finaliza.

Error "nil.dependencies" en `rake gems`

En la versión 2.2.2 de Rails, al ejecutar rake:gems aparece el siguiente mensaje (con alguna posible variación dependiendo de las gemas principalmente):


   1 neoriddle@neobalam ~/proyectos/miproyecto $ rake gems
   2 (in /home/neoriddle/proyectos/miproyecto)
   3  - [I] calendar_date_select >= 1.13
   4   - [ ] hoe = 1.8.2
   5   - [ ] rubyforge = 1.0.2
   6   - [I] rake = 0.8.3
   7  - [I] mini_magick >= 1.2.3
   8   - [ ] hoe = 1.8.2
   9   - [ ] rubyforge = 1.0.2
  10   - [I] rake = 0.8.3
  11  - [I] RedCloth >= 4.1.1
  12 rake aborted!
  13 You have a nil object when you didn't expect it!
  14 The error occurred while evaluating nil.dependencies
  15 
  16 (See full trace by running task with --trace)
  17 neoriddle@neobalam ~/proyectos/miproyecto $

Este es un error que hay en la versión de la gema, así que para solucionarlo hay que abrir el archivo /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/rails/gem_dependency.rb (esta ubicación podría variar por el sistema operativo o alguna opción en la instalación) y ubicar el siguiente fragmento de código:


   1 def dependencies
   2   return [] if framework_gem?
   3   all_dependencies = specification.dependencies.map do |dependency|
   4     GemDependency.new(dependency.name, :requirement => dependency.version_requirements)
   5   end
   6   all_dependencies += all_dependencies.map(&:dependencies).flatten
   7   all_dependencies.uniq
   8 end

Basta con agregar la siguiente línea return [] if specification.nil?, de manera que quedaría de la siguiente forma:


   1 def dependencies
   2   return [] if framework_gem?
   3   return [] if specification.nil?
   4   all_dependencies = specification.dependencies.map do |dependency|
   5     GemDependency.new(dependency.name, :requirement => dependency.version_requirements)
   6   end
   7   all_dependencies += all_dependencies.map(&:dependencies).flatten
   8   all_dependencies.uniq
   9 end

Una vez editado, hay que guardar los cambios y regresemos a ejecutar de nuevo la instrucción inicial rake:gems y el resultado es el siguiente:


   1 neoriddle@neobalam ~/proyectos/miproyecto $ rake gems
   2 (in /home/neoriddle/proyectos/miproyecto)
   3  - [I] calendar_date_select >= 1.13
   4     - [ ] hoe = 1.8.2
   5     - [ ] rubyforge = 1.0.2
   6     - [I] rake = 0.8.3
   7  - [I] mini_magick >= 1.2.3
   8     - [ ] hoe = 1.8.2
   9     - [ ] rubyforge = 1.0.2
  10     - [I] rake = 0.8.3
  11  - [I] RedCloth >= 4.1.1
  12     - [ ] echoe
  13 
  14 I = Installed
  15 F = Frozen
  16 R = Framework (loaded before rails starts)
  17 neoriddle@neobalam ~/proyectos/miproyecto $

Este es un bug en esta versión de Rails.

lunes, 8 de diciembre de 2008

Tabla simulando un arbol

Seguramente se ha presentado el caso donde tiene una tabla a nivel base de datos que guarda la información de una entidad que tiene un comportamiento de árbol, peensando un ejemplo práctico tenemos una tabla de Categorias la cual esta construida por el siguiente script:

   1 CREATE TABLE categories (
   2   id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   3   nombre VARCHAR(20) NOT NULL,
   4   parent_id BIGINT NULL
   5 );


De esta manera podriamos tener lo siguiente:

  • General de División
    • General de Brigada
      • General Brigadrier


Y visto como una tabla tendrías:

id |        nombre       | parent_id
------------------------------------
 1 | General de División |   null
 2 | General de Brigada  |     1
 3 | General Brigadier   |     2


Vayamos al código...
Existe una funcion llamada "acts_as_tree" la cual nos ayuda con ese comportamiento, es importante hacer la aclaración que hasta la versión 1.x de Rails (mas específicamente en ActiveRecord) era parte de ésta, pero apartir de la versión 2.x, ésta fue seprada para convertirse en un plugin.

La instalación del plugin es muy sencilla, basta con ejecutar la siguiente linea:

script/plugin install acts_as_tree


Una vez hecho esto, podemos ir a nuestra clase model "Categoria":

   1 class Categoria < ActiveRecord::Base
   2   acts_as_tree :order => 'parent_id'
   3 end


De esta manera tenemos los isguientes metodos disponibles para aprovechar mucho mejor el comportamiento en arbol:

MétodoDescripcion
childrendevuelve todos los hijos inmediatos
parentdevuelve el padre (objeto inmediato)
siblingsdevuelve todos los hijos del mismo padre (hermanos)
self_and_siblingsdevuelve todos los hermanos incluyéndome
ancestorsdevuelve todos los objetos padre hasta llegar a la raiz (padre, abuelo, etc)
rootdevuelve el objeto raiz de la jerarquía


Digg!

lunes, 9 de junio de 2008

Railscasts

A todos los programadores de Rails muy seguramente les servirá esta página, se llama Railscasts, la cual tiene pequeñas "recetas de cocina" sobre el trabajo con Rails. Y para los que están cansados de que cuando le preguntan a alguien los manda a Google, aquí a parte de dar soluciones tienen un video como demostración para ver la implementación paso a paso. Vale la pena tenerlo entre los favoritos y hasta tener el feed suscrito.

Digg!

domingo, 1 de junio de 2008

Error al generar controlador con Login_Generator en Rails 2.0

Tratando de implementar un sistema de seguridad por logeo en una aplicacion en Rails 2.0, uno de los pasos señala que hay que generar un controlador con la siguiente instrucción:

ruby script/generate login <controlador&rt;

En mi caso lo hice así:

$ ruby script/generate login Security
    create lib/login_system.rb
    create app/controllers/security_controller.rb
    create test/functional/security_controller_test.rb
    create app/helpers/security_helper.rb
    create app/models/user.rb
    create test/unit/user_test.rb
    create test/fixtures/users.yml
No such file or directory - /usr/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/rails_generator/generators/components/scaffold/templates/layout.rhtml
$


Revisando un poco el directorio para comprobar si realmente ese archivo no existia me di cuenta que si existe, pero con otro nombre:

$ ls -l /usr/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/rails_generator/generators/components/scaffold/templates/
total 40
-rw-r--r-- 1 root root 2464 may 13 23:47 controller.rb
-rw-r--r-- 1 root root 1256 may 13 23:47 functional_test.rb
-rw-r--r-- 1 root root 46 may 13 23:47 helper.rb
-rw-r--r-- 1 root root 495 may 13 23:47 layout.html.erb
-rw-r--r-- 1 root root 1152 may 13 23:47 style.css
-rw-r--r-- 1 root root 463 may 13 23:47 view_edit.html.erb
-rw-r--r-- 1 root root 697 may 13 23:47 view_index.html.erb
-rw-r--r-- 1 root root 411 may 13 23:47 view_new.html.erb
-rw-r--r-- 1 root root 285 may 13 23:47 view_show.html.erb
$


Y como podemos ver si existe pero con la convención de nombres de la versión de Rails 2.0 (la cual es .html.erb) y no con la versión 1.2 (la cual es .rhtml).

Así que solo basta con hacer una copia del archivo con el nombre de la versión 2.0 a uno con el nombre de la versión 1.2:

$ cp layout.html.erb layout.rhtml

De esta manera ya existirá:

$ ls -l /usr/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/rails_generator/generators/components/scaffold/templates/
total 40
-rw-r--r-- 1 root root 2464 may 13 23:47 controller.rb
-rw-r--r-- 1 root root 1256 may 13 23:47 functional_test.rb
-rw-r--r-- 1 root root 46 may 13 23:47 helper.rb
-rw-r--r-- 1 root root 495 may 13 23:47 layout.html.erb
-rw-r--r-- 1 root root 495 jun 1 15:38 layout.rhtml
-rw-r--r-- 1 root root 1152 may 13 23:47 style.css
-rw-r--r-- 1 root root 463 may 13 23:47 view_edit.html.erb
-rw-r--r-- 1 root root 697 may 13 23:47 view_index.html.erb
-rw-r--r-- 1 root root 411 may 13 23:47 view_new.html.erb
-rw-r--r-- 1 root root 285 may 13 23:47 view_show.html.erb
$


Y con esto ya podremos seguir con la creacion del controlador (en mi caso aquí esta el ejemplo):

$ ruby script/generate login Security
identical lib/login_system.rb
identical app/controllers/security_controller.rb
identical test/functional/security_controller_test.rb
identical app/helpers/security_helper.rb
identical app/models/user.rb
identical test/unit/user_test.rb
identical test/fixtures/users.yml
overwrite app/views/layouts/scaffold.rhtml? (enter "h" for help) [Ynaqdh]
Y - yes, overwrite
n - no, do not overwrite
a - all, overwrite this and all others
q - quit, abort
d - diff, show the differences between the old and the new
h - help, show this help
overwrite app/views/layouts/scaffold.rhtml? (enter "h" for help) [Ynaqdh] Y
    force app/views/layouts/scaffold.rhtml
    identical public/stylesheets/scaffold.css
    create app/views/security
    create app/views/security/welcome.rhtml
    create app/views/security/login.rhtml
    create app/views/security/logout.rhtml
    create app/views/security/signup.rhtml
    create README_LOGIN
$


Digg!

viernes, 29 de febrero de 2008

Ruby fácil para principiantes

Me he encontrado a muchos compañeros los cuales han querido aprender otros lenguajes de los clásicos que en las escuelas se imparten en el mejor de los casos medianamente bien.

Aquí les traigo algunos libros que a mi juicio son bueno para empezar a hacer pininos. Estos van desde lo muy sencillo a lo mas avanzado y de varias formas para bordar y dar una introducción los temas; los estilos son muchos, algunos como una especificación otro como una noción básica y poco a poco agregar detalles o subir el nivel.

El listado es el siguiente:

-Ruby Pocket Reference (O'Reilly)
-Ruby on Rails: Up and Running )O'Relliy)

Próximamente enlistaré mas libros en cuanto encuentre nuevamente los títulos.