No puedo acceder a una variable de instancia


#1

Hola a todos,

Llevo toda la tarde liado con un tema muy básico pero que no me deja
avanzar con mi aplicación en Rails. Tengo dos controladores, uno que
hereda del de Application y otro de este mismo, llamando a un método del
primero.

Os pongo el código:


queue_controller.rb

class QueueController < APIController
before_filter :responds

def select_by_cli_and_id
#@result = QueueModel.find(:all, :conditions => [“cli_id_fk = ? and
id = ?”, 198, 78])
@result = [‘aaa’, ‘bbb’]
end

def select_by_cli_and_acvd_order
@result = QueueModel.find(:all, :conditions => [“cli_id_fk = ? and
id = ?”, 198, 78])
end

def select_by_cli_and_acvd_order_by_id_limit
@result = QueueModel.find(:all, :conditions => [“cli_id_fk = ? and
id = ?”, 198, 78])
end

def select_strategy_by_id
@result = QueueModel.find(:all, :conditions => [“cli_id_fk = ? and
id = ?”, 198, 78])
end

def select_by_cli_and_acdv_order_by_nombrecola
@result = QueueModel.find(:all, :conditions => [“cli_id_fk = ? and
id = ?”, 198, 78])
end

private
def responds
#super([‘una cosa’, ‘otra cosa’])
super(@result)
end
end


api_controller.rb

class APIController < ApplicationController
def index
redirect_to(:controller => ‘home’)
end

private
def responds(result)
@result = result
respond_to do |format|
format.html { @phpSerialized = PHP.serialize(@result) }
format.xml { render :xml => @result }
end
end
end

El caso es que intento pasarle la variable @result del primero al
segundo y nada, ni puto caso. Como véis, he probado a enviar un array
desde “responds” directamente (el que está ahora comentado) y lo recibe
sin problemas, así que el error está al intentar recuperar la variable
de “select_by_cli_and_id”, ya que enviándolo desde ahí no lo recibe ni
para trás.

¿Me podéis echar una mano? Seguro que es una tontería, pero estoy
empezando con Ruby y me encuentro bastante perdido…

Gracias. Un saludo. :slight_smile:


#2

has probado a recibir @result = result
desde un metodo que no sea private? Por probar…

Luego lo de nombrar asi los archivos: api_controller.rb (con barra baja)
No se si chocara con las convenciones de rails…otra idea…

El 28 de enero de 2009 18:34, Dahn 06
removed_email_address@domain.invalidescribió:


#3

+1 a lo que comenta Raul.

Por otro lado, al llamar el metodo responds desde un before_filter,
realmente se está ejecutando ANTES de la llamada a la acción, por lo
que la variable @responds todavia es null.

deberias cambiar el befor_filter por un around_filter…

around_filter :send_result_to_responds

def send_result_to_responds
yield
responds(@result)
end

Saludos,

Isaac Feliu


#4

Muchas gracias a todos, ya lo he conseguido. :slight_smile:

Al final lo he hecho llamando a la función de la clase padre
directamente, en vez de instaurar la variable y pasársela mediante un
filter. Era una tonteria, pues no estaba teniendo en cuenta la herencia.

Lo dicho: ¡gracias! :slight_smile:


#5

El día 28 de enero de 2009 18:34, Dahn 06
removed_email_address@domain.invalid
escribió:> queue_controller.rb

 super(@result)

end
end

class APIController < ApplicationController
private
def responds(result)
@result = result

Creo que a estas horas estoy un poco embotado pero veo algo raro: el
método de la clase padre también tiene acceso a esa variable de
instancia, ¿realmente necesitas pasársela como parámetro en lugar de
acceder a ella desde dentro del propio método?