¿Cómo usar una variable de un método a otro en una misma clase en Ruby?

Soy nuevo en Ruby. Tengo un código de abajo en mi controlador. Comportamiento deseado: – Quiero mostrar la cadena de error de validación a mis vistas en la página de edición. Así que estoy poniendo esos errores en una variable. Cuando la validación falla, quiero usar esa variable en mi método de edición, para poder mostrarla en la vista de página de edición.

Comportamiento observado: hay una variable @vpinerr en el método de creación . Quiero usar esa variable en el método de edición . Intenté usar la variable de clase (@@ vpinerr) y la inicialicé con una cadena vacía (@@ vpinerr = “”), entonces el valor de esta variable se vacía en el método de edición.

require 'rho/rhocontroller' require 'helpers/browser_helper' class LeadController  '/app' end # GET /Lead/new def new @lead = Lead.new render :action => :new, :back => url_for(:action => :index) end def create # Update if Lead.find(@params['id']) @lead = Lead.find(@params['id']) # array of objects @leadadd = LeadAddress.find(:all, :conditions => {:parentKey => @lead.object} ) @leadcon = LeadContact.find(:all, :conditions => {:parentKey => @lead.object} ) #hash of hashes leadaddressArray = @params['leadaddress'] arr1 = @leadadd.count - 1 for i in 0..arr1 j=i.to_s @leadaddHash = @leadadd[i] leadaddressHash = leadaddressArray[j] if leadaddressHash['removed'] == "1" singleadd = LeadAddress.find(:first, :conditions => {:object => leadaddressHash['object']} ) singleadd.destroy if singleadd else #validation vpin = leadaddressHash['pincode'] #validation check if vpin =~ /^[[:digit:]]+$/ @leadaddHash.update_attributes(leadaddressHash) if @leadaddHash else err = 1 @vpinerr = "Pincode is invalid" end end end leadconArray = @params['leadcontact'] arr2 = @leadcon.count - 1 for k in 0..arr2 z=k.to_s @leadconHash = @leadcon[k] leadContact = leadconArray[z] if leadContact['removed'] == "1" singlecon = LeadContact.find(:first, :conditions => {:object => leadContact['object']} ) singlecon.destroy if singlecon else @leadconHash.update_attributes(leadContact) if @leadconHash end end @lead.update_attributes(@params['lead']) if @lead if err == 0 redirect :action => :index else redirect :action => :edit, :id => @lead.object, :vpin =>@vpinerr end else # Create err = 0 # validation vlead = @params['lead'] vfirstname = vlead['firstname'] vlastname = vlead['lastname'] vage = vlead['age'] #validation check if (vfirstname =~ /^[[:alpha:][:blank:]]+$/) and (vlastname =~ /^[[:alpha:][:blank:]]+$/) and (vage =~ /^[[:digit:]]+$/) @lead = Lead.create(@params['lead']) @key = @lead.object else err = 1 @basicerr = "Basic Details are invalid" end if @params['leadaddress'] leadaddressArray = @params['leadaddress'] arrcount = leadaddressArray.count for i in 1..arrcount j=(i-1).to_s leadaddressHash = leadaddressArray[j] #validation vpin = leadaddressHash['pincode'] #validation check if vpin =~ /^[[:digit:]]+$/ @leadAdd = LeadAddress.create(leadaddressHash) @leadAdd.parentKey = @key @leadAdd.save() else err = 1 @vpinerr = "Pincode is invalid" end end end if @params['leadcontact'] leadconArray = @params['leadcontact'] arrcount2 = leadconArray.count for k in 1..arrcount2 h=(k-1).to_s leadconHash = leadconArray[h] #validation vhome = leadconHash['home'] vmobile = leadconHash['mobile'] vemail = leadconHash['email'] #validation check if (vhome =~ /^[[:digit:]]+$/) and (vmobile =~ /^[[:digit:]]+$/) and (vemail =~ /\A([\w+\-]\.?)+@[az\d\-]+(\.[az]+)*\.[az]+\z/i) @leadcontact = LeadContact.create(leadconHash) @leadcontact.parentKey = @key @leadcontact.save() else err = 1 @contacterr = "Contact Details are invalid" end end end if err == 0 redirect :action => :index else redirect :action => :edit, :id => @lead.object end end end # GET /Lead/{1} def show @lead = Lead.find(@params['id']) @leadadd = LeadAddress.find(:all, :conditions => {:parentKey => @lead.object} ) @leadcontact = LeadContact.find(:all, :conditions => {:parentKey => @lead.object} ) if @lead render :action => :show, :back => url_for(:action => :index) else redirect :action => :index end end # GET /Lead/{1}/edit def edit @lead = Lead.find(@params['id']) @leadaddress = LeadAddress.find(:all, :conditions => {:parentKey => @lead.object} ) @leadcontact = LeadContact.find(:all, :conditions => {:parentKey => @lead.object} ) @vpinerr2 = @vpinerr if @lead render :action => :new, :back => url_for(:action => :index) else redirect :action => :index end end end 

Las variables con un prepending @ se consideran variables de instancia y están disponibles en la instancia de una clase. Su controlador es una clase y con cada solicitud, Rails crea una instancia de un nuevo controlador. En ese sentido, cuando realiza una solicitud para la acción de creación, se crea una nueva instancia y @vpinerr se establece en la instancia. Cuando redirige al usuario a la acción de edición, se crea una instancia de una nueva solicitud y una nueva instancia de controlador. Dado que las instancias de acciones de creación y edición son diferentes, no tendrá el valor de @vpinerr en la acción de edición.

Tienes alternativas.

  1. Variables de nivel de clase.

Las variables de nivel de clase se establecen en la clase y están disponibles en todas las instancias. Cualquier variable precedida con @@ son variables de clase. Cambie a @@vpinerr todas partes en lugar de @vpinerr .

Sería incorrecto utilizarlo en su caso porque, podría desear que sea diferente para cada usuario, pero el uso de la variable de clase mantendrá el valor para otros usuarios también hasta que se modifique. Lea acerca de las variables de clase: http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby

  1. Variables de sesión.

Las variables de sesión se utilizan para guardar variables dentro de una sesión. Pueden ser compartidos entre los controladores también. Para configurar una variable de session[:vpinerr] = "Some error" y usarla, puede simplemente llamar a la session[:vpinerr] .

    Intereting Posts