Problema con rutas

He abierto este hilo porque me ha surgido una duda especifica de un
metodo tras estar trasteando con el script/runner. Os explico:

Tengo un problema a la hora de actualizar el usuario del dia, y seguro
que es por las rutas. A la hora de asignar el usuario del dia lo que
hacemos es dentro de un grupo de usuarios que se han seleccionado
comprobar cuales tienen avatar y en funcion de esto se asignan como
tales o descartarlos como usuarios del dia.

En el modelo del avatar loq ue hacemos primero es entrar en la funcion
initialize ue es la que genera el error. Esta lo unico que hace es crear
DIRECTORIO en duncion de si exitia o no.

DIRECTORIO = File.join(“public”, “images”, “avatar”)

def initialize(usuario, imagen=nil)
@usuario = usuario
@imagen = imagen
Dir.mkdir(DIRECTORIO) unless File.directory?(DIRECTORIO)
end

El problema esta aqui, pues el log de cron muestra lo sigueinte:

From: [email protected] (Cron Daemon)
To: [email protected]
Subject: Cron jose@Jose /opt/local/bin/ruby
/Users/jose/mimandote.com/script/runner ‘Usuario.new_usr_dia’
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=jose>
X-Cron-Env: <USER=jose>
X-Cron-Env: <HOME=/Users/jose>
Message-Id: [email protected]
Date: Tue, 21 Apr 2009 13:07:03 +0200 (CEST)

/opt/local/lib/ruby/gems/1.8/gems/rails-2.1.2/lib/commands/runner.rb:47:
/Users/jose/mimandote.com/app/models/avatar.rb:21:in mkdir': No such file or directory - public/images/avatar (Errno::ENOENT) from /Users/jose/mimandote.com/app/models/avatar.rb:21:in initialize’
from /Users/jose/mimandote.com/app/models/usuario.rb:169:in
new' from /Users/jose/mimandote.com/app/models/usuario.rb:169:in avatar’
from /Users/jose/mimandote.com/app/models/usuario.rb:251:in
new_usr_dia' from /Users/jose/mimandote.com/app/models/usuario.rb:250:in each’
from /Users/jose/mimandote.com/app/models/usuario.rb:250:in
new_usr_dia' from (eval):1 from /opt/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in eval’
from
/opt/local/lib/ruby/gems/1.8/gems/rails-2.1.2/lib/commands/runner.rb:47
from
/opt/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in
gem_original_require' from /opt/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in require’
from /Users/jose/mimandote.com/script/runner:3

Se esta quejando de que no existe la ruta public/images/avatar. Que
deberia hacer, pasarla como una ruta absoluta??. Esta claro que en ese
caso no valdria uan al estilo Users/jose/mimandote.com/public/… y
tendria que escribir la del servidor, verdad?. Como puedo obtener la
ruta del servidor, la verdad es que estoy un poco perdido en ese
aspecto?

Hay que corregir esta linea:

DIRECTORIO = File.join(Rails.public_path, “images”, “avatar”)

Saludos.

Ruben Davila wrote:

Hay que corregir esta linea:

DIRECTORIO = File.join(Rails.public_path, “images”, “avatar”)

Saludos.

Gracias por la respuesta, mañana lo implemento.

Salu2

Ruben Davila wrote:

Hay que corregir esta linea:

DIRECTORIO = File.join(Rails.public_path, “images”, “avatar”)

Saludos.

Lo he intentado como dices, pero no ha dado resultado…lo que me
“preocupa”
es que cron no ha mandado ningun error en el log al ponerlo como
dices…es como si todo hubiera ido bien…pero mi usuario del dia no
cambiaba.

Os comento un poco el codigo que tengo…
Esta es la linea que tengo en el crontab:

  •   */6       *       *       *       /opt/local/bin/ruby 
    

/Users/jose/mimandote.com/script/runner ‘Usuario.new_usr_dia’

Con ella quiero ejecutar cada 6 horas el metodo new_usr_dia. Ahora os
comento un poco como lo tengo en la aplicacion:

En el modelo de usuario tengo definido el new_usr_dia. Basicamente lo
que hace es seleccionar dentro de un grupo de usuarios uno que tenga
avatar y aun no haya sido usuario del dia.

def self.new_usr_dia
cambiado = false
Usuario.all(:conditions => “usuario_del_dia is NULL”, :order =>
“posicion_ranking”, :limit => 200).each do |usuario|
if cambiado == false and usuario.avatar.existe? # El usuario del
dia tiene que tener avatar
usuario.update_attribute(‘usuario_del_dia’,Time.now.to_s(:db))
cambiado = true
end
end
‘UPDATE usuarios SET usuario_del_dia = NULL’.lanza_sql if
cambiado == false
end

En el modelo de avatar tengo:

la constante DIRECTORIO:

DIRECTORIO = File.join(“public”, “images”, “avatar”)
(Esta es la que habia cambiado por DIRECTORIO =
File.join(Rails.public_path, “images”, “avatar”)

Los metodos:

def initialize(usuario, imagen=nil) #Crea el directorio si no existe
@usuario = usuario
@imagen = imagen
Dir.mkdir(DIRECTORIO) unless File.directory?(DIRECTORIO)
end

def existe?
logger.debug “AVATAR.RB(existe?): directorio #{DIRECTORIO} - todo
#{File.join(DIRECTORIO, nombre_archivo)}”
File.exists?(File.join(DIRECTORIO, nombre_archivo))
end


NOTA

Lo mas extraño es que antes de ponerme a investigar como poder
automatizar esta tarea con el script/runner la corriamos a mano desde un
panel de control que tenemos para usuarios que lo unico que hacia era
llamar a la funcion new usuario del dia si desde la vista. Tan simple
como esto:

Usuario.new_usr_dia if params[:accion] == ‘new-usr-dia’

Solucionado…si lo ejecutaba en local no puedo esperar que se ejecute
en el servidor!!!.

Entre en el servidor, modifique las rutas a las correspondientes en el
servidor y le añadi el script/runner y todo como la seda. Costo, pero he
aprendido unas cuantas cosas…gracias a to2 por la ayuda.