如何在Ruby中的同一个类中使用从一个方法到另一个方法的变量?

时间:2017-07-05 06:59:51

标签: ruby ruby-1.9 rhomobile rhodes

我是Ruby新手。我的控制器中有以下代码。 所需行为: - 我想在编辑页面上显示验证错误字符串到我的视图。所以我把这些错误放在一个变量中。当验证失败时,我想在我的编辑方法中使用该变量,以便我可以在我的编辑页面视图中显示该变量。

观察到的行为: -  创建方法中有一个变量 @vpinerr 。我想在编辑方法中使用该变量。我试图使用类变量(@@ vpinerr)并用空字符串初始化它(@@ vpinerr ="")然后在编辑方法中该变量的值变为空。

require 'rho/rhocontroller'
    require 'helpers/browser_helper'

    class LeadController < Rho::RhoController
      include BrowserHelper

      # GET /Lead
      def index
        @leads = Lead.find(:all)
        render :back => '/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+\-]\.?)+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\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

1 个答案:

答案 0 :(得分:0)

带有前置@的变量被视为实例变量,可在类的实例中使用。您的控制器是一个类,每个请求,Rails实例化一个新的控制器实例。从这个意义上讲,当您对create操作发出请求时,会创建一个新实例并在实例中设置@vpinerr。将用户重定向到编辑操作时,会实例化新请求和新控制器实例。由于创建操作和编辑操作的实例不同,因此编辑操作中的值不会为@vpinerr

你有其他选择。

  1. 班级变量。
  2. 类级变量在类上设置,并且在所有实例中都可用。前缀为@@的任何变量都是类变量。更改为@@vpinerr,而不是@vpinerr

    在你的情况下使用这是错误的,因为你可能希望它对每个用户都不同,但使用类变量将保留其他用户的值,直到它被改变。阅读类变量:http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby

    1. 会话变量。
    2. 会话变量用于保存会话中的变量。它们也可以在控制器之间共享。要设置会话变量session[:vpinerr] = "Some error"并使用它,您可以简单地调用session[:vpinerr]