0

タイトルが示すように、find_by_id を使用している場合でも、Heroku の本番環境で例外が発生していました。原因はわかりませんがbegin/ensure、問題を回避するために a を使用しましたが、まだ問題が発生しています。

これが私の最初の解決策でした:

    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):

だから、私の2つの質問:

  • 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のプロパティが を返すかどうかをチェックします。が存在しない (したがって である)場合は、効果的に を呼び出しており、これが例外を発生させています。regionnilregionnilnil.id

かどうかを確認したいだけの場合regionnilelsif !region十分なはずです。

begin(ここにあるものから、 /ensureブロックも必要ないように見えます。)

于 2013-10-18T02:01:00.670 に答える