Ruby on Rails测试Nil - NoMethodError Nil:class

时间:2014-06-30 18:48:14

标签: ruby-on-rails ibm-midrange null nomethoderror db2-400

我们几个月来一直在努力解决这个问题,并没有做到这一点。由于这是第一次被问到,我们更改了代码(基于该网站的原始开发人员所建议的内容),但我们仍然没有达到我们需要的位置。

我对Ruby比较陌生,目前正在学习一些课程以了解更多信息,所以请耐心等待。我们正在使用Ruby 1.9和Rails 3.2我们使用AS 400 / DB2作为我们的数据库。

我们有一个在线订购网站,您必须设置一个帐户才能访问。根据您设置的帐户类型,您可能必须由某人批准您的订单。即如果我是一个掉落帐户,我的经销商必须批准我订购的东西。此外,如果我是一个专用的下落帐户,我的经销商也必须批准我订购的东西。

        if sign_on.acctypw1.strip == "DS" or sign_on.acctypw1.strip == "DSD"        
            rec = SignOn.first(:conditions => {:userw1 => login}, :select=> "prfdstw1")      
                #ignore_exception { puts "webid = rec.prfdstw1"; raise Exception; puts "webid = rec.prfdstw1";}   
                webid = "rec.prfdstw1"
                def ignore_exception
                   begin
                     yield  
                   rescue Exception
                  end
                end   

        if sign_on.acctypw1.strip == "DS"   
             rec = SignOn.find_by_userw1(login)            
            webid = rec.prfdstw1 

        end 

        elsif sign_on.acctypw1.strip == "DSD"   
             rec = SignOn.find_by_userw1(login)            
            webid = rec.prfdstw1 
        end 

我们正在接收批准电​​子邮件,但我们注意到,例如,如果没有专用投递的电子邮件地址,我们就会收到NOMethodError (undefined method 'prfdstw1' for nil:NilClass)

我的猜测是我需要一种方法来测试Nil,在ROR中这样做的最佳方法是什么?

UPDATE ---------------- 我得到的一些DS帐户的错误是:

NoMethodError (undefined method `prfdstw1' for nil:NilClass): 
  app/models/order.rb:355:in `submit_order'

第355行

target_email = Contact.connection.select_values
("SELECT EMAL23 FROM WEBOEL23 WHERE ACT223 = #
{Contact.connection.quote(rec.prfdstw1)}").uniq

在进一步测试时,似乎失败发生在拥有2个以上批准电子邮件的帐户上。

我现在的理论是,我在做数组的方式存在问题

                if sign_on.acctypw1.strip == "DS" or sign_on.acctypw1.strip == "DSD" 
                    # If there is no distributor email address, the mailer model will substitute in the admin's email from their settings
                     target_email.each do | email_address | Mailer.deliver_order_distributor_approval_email(email_address, 'Coastal Pet Online Ordering<noreply@coastalpet.com>', "Order Confirmation Approval", email_details)
                     end

有没有更好的方法返回数组taht允许超过2封电子邮件?

1 个答案:

答案 0 :(得分:1)

这取决于你想要的。

您可以使用:

webid = rec.prfdstw1 if rec

或者这个:

webid = rec ? rec.prdfdstw1 : "null"