0

正如标题所暗示的那样——在 Heroku 的生产环境中出现了一个异常,即使我使用 find_by_id 也是如此。我不确定原因是什么,但我已经使用 abegin/ensure来规避这个问题,但我仍然遇到问题。

这是我最初的解决方案:

    def select_location
        begin
            region = Region.find_by_id(params[:Digits])
        ensure
            Twilio::TwiML::Response.new do |r|

                # if user pressed "9" (redirect)
                if (params[:Digits] == '0')

                    @response = r.Redirect call_hq_path, method: 'GET'

                # if region does not exist
                elsif !region.id
                    @response = r.Play Clip.where(name: "invalid").first.url
                    @response = r.Redirect index_path, method: 'GET'
                else
                    @response = r.Gather action: location_description_path(region), numDigits: '1' do |g|
                        region.locations.order(:number).each do |location|
                            g.Play location.listing_clip.url
                            g.Play number_url(location.number)
                        end
                        g.Play Clip.where(name: "9toreturn").first.url
                    end
                end
            end
        end

        render :xml => @response
    end

这里的问题在于elsif !region.id - 我仍然遇到这个错误:

2013-10-18T01:29:14.524289+00:00 app[web.1]: NoMethodError (undefined method `id' for nil:NilClass):

所以,我的两个问题:

  • begin/ensure绕过这个问题的最好方法吗?
  • 如果是,我该如何解决这个elsif问题?

更新

.id从-删除后,elsif我收到此错误:

2013-10-18T02:06:57.055617+00:00 app[web.1]: NoMethodError (undefined method `url' for nil:NilClass):

elsif不开火怎么办?

4

1 回答 1

0

elsif !region.id不检查区域是否存在,它检查对象id的属性是否region返回nil。如果region不存在(因此 is nil),您实际上是在调用nil.id,这就是引发异常的原因。

如果您只想检查 if regionis nilelsif !region就足够了。

(从你这里的情况来看,看起来也不需要begin/ensure块。)

于 2013-10-18T02:01:00.670 回答