質問編集履歴

6 情報の追加

s_diff

s_diff score 101

2019/01/10 15:19  投稿

[Ruby On Rails]renderやredirect_toを使っていないのにAbstractController::DoubleRenderError
ローカル環境や本番環境では問題ないのですが、staging環境でのみDoubleRenderErrorが出ます。
エラーメッセージの最後にredirect_to(...) and returnとあるのですが、このアクション内にはredirect_toもrenderもないため、別のところに問題があると推測しています。
## エラー全文
AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".):
## 環境
macOS High Sierra(バージョン10.13.6)
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin17]
Rails 4.2.6
##試したこと
以下のようにproduct_controllerのdownloadzipアクションにデバッグを追加してログを確認してみました。
```ruby
# product_controller.rb
def downloadzip
   @product = Product.find_by(id: params[:id])
   download_cnts = DownloadLog.where(user_id: current_user.id).current_month.count
   plan = current_user.enable_download_plan
   logger.debug("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
   return if download_cnts >= plan.download_limit
   logger.debug("bbbbbbbbbbbbbbbbbbbbbbbbbbbb")
   file_path = set_zip_url(@product)
   logger.debug("cccccccccccccccccccccccccccccccc")
   ActiveRecord::Base.transaction do
     logger.debug("dddddddddddddddddddddddddddddddd")
     file_download(file_path, "livesearch")
     logger.debug("eeeeeeeeeeeeeeeeeeeeeeeeeeeeee")
     logger.debug(current_user)
     logger.debug("ffffffffffffffffffffffffffffff")
     logger.debug(@product)
     logger.debug("ggggggggggggggggggggggggggggggggg")
     DownloadLog.create(user_id: current_user.id, product_id: @product.id)
     logger.debug("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")
   end
 end
```
staging.logでログを確認すると、
logger.debug("ggggggggggggggggggggggggggggggggg")までは問題ないようですが、logger.debug("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")でのデバッグがなく、DownloadLog.create(user_id: current_user.id, product_id: @product.id)の部分でエラーが起きているようです。
```
# staging.log
D, [2019-01-10T03:13:33.310428 #9193] DEBUG -- : ggggggggggggggggggggggggggggggggg
D, [2019-01-10T03:13:33.315289 #9193] DEBUG -- :  ESC[1mESC[36mProduct Load (0.3ms)ESC[0m ESC[1mSELECT `products`.* FROM `products` WHERE `products`.`id` = 67 LIMIT 1ESC[0m
D, [2019-01-10T03:13:33.316273 #9193] DEBUG -- :  ESC[1mESC[35m (0.2ms)ESC[0m SELECT COUNT(*) FROM `download_logs` WHERE `download_logs`.`product_id` = 67
D, [2019-01-10T03:13:35.683743 #9193] DEBUG -- :  ESC[1mESC[36m (0.1ms)ESC[0m ESC[1mROLLBACKESC[0m
E, [2019-01-10T03:13:35.684035 #9193] ERROR -- : Rendering 500 with exception: undefined method `[]' for nil:NilClass
I, [2019-01-10T03:13:35.947113 #9193] INFO -- : Completed 500 Internal Server Error in 3226ms (ActiveRecord: 8.6ms)
F, [2019-01-10T03:13:36.198009 #9193] FATAL -- :
AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".):
 app/controllers/application_controller.rb:51:in `block (2 levels) in handle_500'
 app/controllers/application_controller.rb:49:in `handle_500'
```
Rendering 500 with exception: undefined method `[]' for nil:NilClassとありますが、[]を記述していないので、なぜこのエラーができているのかわかりません。model/download_log.rbにもapplication_controller.rbのhandle500にも記述はありませんでした。
```ruby
# model/download_log.rb
class DownloadLog < ActiveRecord::Base
 belongs_to :user, foreign_key: 'user_id'
 belongs_to :product, foreign_key: 'product_id'
 scope :current_month, -> { where(created_at: Time.current.beginning_of_month..Time.current.end_of_month) }
 before_save :set_dl_cnt_to_product
 def set_dl_cnt_to_product
   self.product.update(dl_cnt: DownloadLog.where(product_id: self.product.id).count + 1)
 end
end
```
```ruby
# application_controller.rb
class ApplicationController < ActionController::Base
 protect_from_forgery with: :exception
 rescue_from Exception, with: :handle_500 unless Rails.env.development?
 def handle_500(exception = nil)
   logger.error "Rendering 500 with exception: #{exception.message}" if exception
   ExceptionNotifier.notify_exception(exception, env: request.env, data: {message: "error"})
   respond_to do |format|
     format.html {
       return render template: 'errors/error_500', status: 500, layout: false, content_type: 'text/html'
     }
     format.all {
       return head :internal_server_error
     }
   end
 end
end
```
また、application_controller.rbのhandle_505内の
```ruby
return render template: 'errors/error_500', status: 500, layout: false, content_type:
```
の一行を
```ruby
render template: 'errors/error_500', status: 500, layout: false, content_type: and return
```
と変えてみましたがエラーメッセージに変化はありませんでした。
## 実現したいこと
staging環境でのみAbstractController::DoubleRenderErrorが起こる原因を究明したいです。
ご教示いただけることがあれば、何卒よろしくお願いいたします。
  • Ruby

    10204 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    9548 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2566 questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • Server

    241 questions

5 情報追加

s_diff

s_diff score 101

2019/01/10 15:13  投稿

[Ruby On Rails]renderやredirect_toを使っていないのにAbstractController::DoubleRenderError
ローカル環境や本番環境では問題ないのですが、staging環境でのみDoubleRenderErrorが出ます。
エラーメッセージの最後にredirect_to(...) and returnとあるのですが、このアクション内にはredirect_toもrenderもないため、別のところに問題があると推測しています。
おそらくサーバーが立ち上がらなくなってから復旧した際の処理の何かが引っかかったのだと思います。
## エラー全文
AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".):
## 環境
macOS High Sierra(バージョン10.13.6)
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin17]
Rails 4.2.6
##試したこと
以下のようにproduct_controllerのdownloadzipアクションにデバッグを追加してログを確認してみました。
```ruby
# product_controller.rb
def downloadzip
   @product = Product.find_by(id: params[:id])
   download_cnts = DownloadLog.where(user_id: current_user.id).current_month.count
   plan = current_user.enable_download_plan
   logger.debug("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
   return if download_cnts >= plan.download_limit
   logger.debug("bbbbbbbbbbbbbbbbbbbbbbbbbbbb")
   file_path = set_zip_url(@product)
   logger.debug("cccccccccccccccccccccccccccccccc")
   ActiveRecord::Base.transaction do
     logger.debug("dddddddddddddddddddddddddddddddd")
     file_download(file_path, "livesearch")
     logger.debug("eeeeeeeeeeeeeeeeeeeeeeeeeeeeee")
     logger.debug(current_user)
     logger.debug("ffffffffffffffffffffffffffffff")
     logger.debug(@product)
     logger.debug("ggggggggggggggggggggggggggggggggg")
     DownloadLog.create(user_id: current_user.id, product_id: @product.id)
     logger.debug("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")
   end
 end
```
staging.logでログを確認すると、
logger.debug("ggggggggggggggggggggggggggggggggg")までは問題ないようですが、logger.debug("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")でのデバッグがなく、DownloadLog.create(user_id: current_user.id, product_id: @product.id)の部分でエラーが起きているようです。
```
# staging.log
D, [2019-01-10T03:13:33.310428 #9193] DEBUG -- : ggggggggggggggggggggggggggggggggg
D, [2019-01-10T03:13:33.315289 #9193] DEBUG -- :  ESC[1mESC[36mProduct Load (0.3ms)ESC[0m ESC[1mSELECT `products`.* FROM `products` WHERE `products`.`id` = 67 LIMIT 1ESC[0m
D, [2019-01-10T03:13:33.316273 #9193] DEBUG -- :  ESC[1mESC[35m (0.2ms)ESC[0m SELECT COUNT(*) FROM `download_logs` WHERE `download_logs`.`product_id` = 67
D, [2019-01-10T03:13:35.683743 #9193] DEBUG -- :  ESC[1mESC[36m (0.1ms)ESC[0m ESC[1mROLLBACKESC[0m
E, [2019-01-10T03:13:35.684035 #9193] ERROR -- : Rendering 500 with exception: undefined method `[]' for nil:NilClass
I, [2019-01-10T03:13:35.947113 #9193] INFO -- : Completed 500 Internal Server Error in 3226ms (ActiveRecord: 8.6ms)
F, [2019-01-10T03:13:36.198009 #9193] FATAL -- :
AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".):
 app/controllers/application_controller.rb:51:in `block (2 levels) in handle_500'
 app/controllers/application_controller.rb:49:in `handle_500'
```
Rendering 500 with exception: undefined method `[]' for nil:NilClassとありますが、[]を記述していないので、なぜこのエラーができているのかわかりません。model/download_log.rbにもapplication_controller.rbのhandle500にも記述はありませんでした。
```ruby
# model/download_log.rb
class DownloadLog < ActiveRecord::Base
 belongs_to :user, foreign_key: 'user_id'
 belongs_to :product, foreign_key: 'product_id'
 scope :current_month, -> { where(created_at: Time.current.beginning_of_month..Time.current.end_of_month) }
 before_save :set_dl_cnt_to_product
 def set_dl_cnt_to_product
   self.product.update(dl_cnt: DownloadLog.where(product_id: self.product.id).count + 1)
 end
end
```
```ruby
# application_controller.rb
class ApplicationController < ActionController::Base
 protect_from_forgery with: :exception
 rescue_from Exception, with: :handle_500 unless Rails.env.development?
 def handle_500(exception = nil)
   logger.error "Rendering 500 with exception: #{exception.message}" if exception
   ExceptionNotifier.notify_exception(exception, env: request.env, data: {message: "error"})
   respond_to do |format|
     format.html {
       return render template: 'errors/error_500', status: 500, layout: false, content_type: 'text/html'
     }
     format.all {
       return head :internal_server_error
     }
   end
 end
end
```
また、application_controller.rbのhandle_505内の  
```ruby  
return render template: 'errors/error_500', status: 500, layout: false, content_type:  
```  
の一行を  
```ruby  
render template: 'errors/error_500', status: 500, layout: false, content_type: and return  
```  
と変えてみましたがエラーメッセージに変化はありませんでした。  
 
## 実現したいこと
staging環境でのみAbstractController::DoubleRenderErrorが起こる原因を究明したいです。
ご教示いただけることがあれば、何卒よろしくお願いいたします。
  • Ruby

    10204 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    9548 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2566 questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • Server

    241 questions

4 情報修正

s_diff

s_diff score 101

2019/01/10 15:03  投稿

[Ruby On Rails]renderやredirect_toを使っていないのにAbstractController::DoubleRenderError
ローカル環境や本番環境では問題ないのですが、staging環境でのみDoubleRenderErrorが出ます。
エラーメッセージの最後にredirect_to(...) and returnとあるのですが、このアクション内にはredirect_toもrenderもないため、別のところに問題があると推測しています。
おそらくサーバーが立ち上がらなくなってから復旧した際の処理の何かが引っかかったのだと思います。
## エラー全文
AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".):
## 環境
macOS High Sierra(バージョン10.13.6)
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin17]
Rails 4.2.6
##試したこと
以下のようにproduct_controllerのdownloadzipアクションにデバッグを追加してログを確認してみました。
```ruby
# product_controller.rb
def downloadzip
   @product = Product.find_by(id: params[:id])
   download_cnts = DownloadLog.where(user_id: current_user.id).current_month.count
   plan = current_user.enable_download_plan
   logger.debug("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
   return if download_cnts >= plan.download_limit
   logger.debug("bbbbbbbbbbbbbbbbbbbbbbbbbbbb")
   file_path = set_zip_url(@product)
   logger.debug("cccccccccccccccccccccccccccccccc")
   ActiveRecord::Base.transaction do
     logger.debug("dddddddddddddddddddddddddddddddd")
     file_download(file_path, "livesearch")
     logger.debug("eeeeeeeeeeeeeeeeeeeeeeeeeeeeee")
     logger.debug(current_user)
     logger.debug("ffffffffffffffffffffffffffffff")
     logger.debug(@product)
     logger.debug("ggggggggggggggggggggggggggggggggg")
     DownloadLog.create(user_id: current_user.id, product_id: @product.id)
     logger.debug("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")
   end
 end
```
staging.logでログを確認すると、
```
# staging.log
D, [2019-01-10T03:13:33.310428 #9193] DEBUG -- : ggggggggggggggggggggggggggggggggg
D, [2019-01-10T03:13:33.315289 #9193] DEBUG -- :  ESC[1mESC[36mProduct Load (0.3ms)ESC[0m ESC[1mSELECT `products`.* FROM `products` WHERE `products`.`id` = 67 LIMIT 1ESC[0m
D, [2019-01-10T03:13:33.316273 #9193] DEBUG -- :  ESC[1mESC[35m (0.2ms)ESC[0m SELECT COUNT(*) FROM `download_logs` WHERE `download_logs`.`product_id` = 67
D, [2019-01-10T03:13:35.683743 #9193] DEBUG -- :  ESC[1mESC[36m (0.1ms)ESC[0m ESC[1mROLLBACKESC[0m
E, [2019-01-10T03:13:35.684035 #9193] ERROR -- : Rendering 500 with exception: undefined method `[]' for nil:NilClass
I, [2019-01-10T03:13:35.947113 #9193] INFO -- : Completed 500 Internal Server Error in 3226ms (ActiveRecord: 8.6ms)
F, [2019-01-10T03:13:36.198009 #9193] FATAL -- :
AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".):
 app/controllers/application_controller.rb:51:in `block (2 levels) in handle_500'
 app/controllers/application_controller.rb:49:in `handle_500'
```
Rendering 500 with exception: undefined method `[]' for nil:NilClassとありますが、[]を記述していないので、なぜこのエラーができているのかわかりません。model/download_log.rbにもapplication_controller.rbのhandle500にも記述はありませんでした。
```ruby
# model/download_log.rb
class DownloadLog < ActiveRecord::Base
 belongs_to :user, foreign_key: 'user_id'
 belongs_to :product, foreign_key: 'product_id'
 scope :current_month, -> { where(created_at: Time.current.beginning_of_month..Time.current.end_of_month) }
 before_save :set_dl_cnt_to_product
 def set_dl_cnt_to_product
   self.product.update(dl_cnt: DownloadLog.where(product_id: self.product.id).count + 1)
 end
end
```
```ruby
# application_controller.rb
class ApplicationController < ActionController::Base
 protect_from_forgery with: :exception
 rescue_from Exception, with: :handle_500 unless Rails.env.development?
 def handle_500(exception = nil)
   logger.error "Rendering 500 with exception: #{exception.message}" if exception
   ExceptionNotifier.notify_exception(exception, env: request.env, data: {message: "error"})
   respond_to do |format|
     format.html {
       return render template: 'errors/error_500', status: 500, layout: false, content_type: 'text/html'
     }
     format.all {
       return head :internal_server_error
     }
   end
 end
end
```
## 実現したいこと
staging環境でのみAbstractController::DoubleRenderErrorが起こる原因を究明したいです。
ご教示いただけることがあれば、何卒よろしくお願いいたします。
  • Ruby

    10204 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    9548 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2566 questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • Server

    241 questions

3 情報修正

s_diff

s_diff score 101

2019/01/10 15:02  投稿

[Ruby On Rails]renderやredirect_toを使っていないのにAbstractController::DoubleRenderError
ローカル環境や本番環境では問題ないのですが、staging環境でのみDoubleRenderErrorが出ます。
エラーメッセージの最後にredirect_to(...) and returnとあるのですが、このアクション内にはredirect_toもrenderもないため、別のところに問題があると推測しています。
おそらくサーバーが立ち上がらなくなってから復旧した際の処理の何かが引っかかったのだと思います。
## エラー全文
AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".):
## 環境
macOS High Sierra(バージョン10.13.6)
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin17]
Rails 4.2.6
##試したこと
以下のようにproduct_controllerのdownloadzipアクションにデバッグを追加してログを確認してみました。
```ruby
# product_controller.rb
def downloadzip
   @product = Product.find_by(id: params[:id])
   download_cnts = DownloadLog.where(user_id: current_user.id).current_month.count
   plan = current_user.enable_download_plan
   logger.debug("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
   return if download_cnts >= plan.download_limit
   logger.debug("bbbbbbbbbbbbbbbbbbbbbbbbbbbb")
   file_path = set_zip_url(@product)
   logger.debug("cccccccccccccccccccccccccccccccc")
   ActiveRecord::Base.transaction do
     logger.debug("dddddddddddddddddddddddddddddddd")
     file_download(file_path, "livesearch")
     logger.debug("eeeeeeeeeeeeeeeeeeeeeeeeeeeeee")
     logger.debug(current_user)
     logger.debug("ffffffffffffffffffffffffffffff")
     logger.debug(@product)
     logger.debug("ggggggggggggggggggggggggggggggggg")
     DownloadLog.create(user_id: current_user.id, product_id: @product.id)
     logger.debug("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")
   end
 end
```
staging.logでログを確認すると、
logger.debug("ggggggggggggggggggggggggggggggggg")までは問題ないようですが、logger.debug("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")がなく、DownloadLog.create(user_id: current_user.id, product_id: @product.id)の部分でエラーが起きているようです。
```
# staging.log
D, [2019-01-10T03:13:33.310428 #9193] DEBUG -- : ggggggggggggggggggggggggggggggggg
D, [2019-01-10T03:13:33.315289 #9193] DEBUG -- :  ESC[1mESC[36mProduct Load (0.3ms)ESC[0m ESC[1mSELECT `products`.* FROM `products` WHERE `products`.`id` = 67 LIMIT 1ESC[0m
D, [2019-01-10T03:13:33.316273 #9193] DEBUG -- :  ESC[1mESC[35m (0.2ms)ESC[0m SELECT COUNT(*) FROM `download_logs` WHERE `download_logs`.`product_id` = 67
D, [2019-01-10T03:13:35.683743 #9193] DEBUG -- :  ESC[1mESC[36m (0.1ms)ESC[0m ESC[1mROLLBACKESC[0m
E, [2019-01-10T03:13:35.684035 #9193] ERROR -- : Rendering 500 with exception: undefined method `[]' for nil:NilClass
I, [2019-01-10T03:13:35.947113 #9193] INFO -- : Completed 500 Internal Server Error in 3226ms (ActiveRecord: 8.6ms)
F, [2019-01-10T03:13:36.198009 #9193] FATAL -- :
AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".):
 app/controllers/application_controller.rb:51:in `block (2 levels) in handle_500'
 app/controllers/application_controller.rb:49:in `handle_500'
```
Rendering 500 with exception: undefined method `[]' for nil:NilClassとありますが、[]を記述していないので、なぜこのエラーができているのかわかりません。model/download_log.rbにもapplication_controller.rbのhandle500にも記述はありませんでした。
```ruby
# model/download_log.rb
class DownloadLog < ActiveRecord::Base
 belongs_to :user, foreign_key: 'user_id'
 belongs_to :product, foreign_key: 'product_id'
 scope :current_month, -> { where(created_at: Time.current.beginning_of_month..Time.current.end_of_month) }
 before_save :set_dl_cnt_to_product
 def set_dl_cnt_to_product
   self.product.update(dl_cnt: DownloadLog.where(product_id: self.product.id).count + 1)
 end
end
```
```ruby
# application_controller.rb
class ApplicationController < ActionController::Base
 protect_from_forgery with: :exception
 rescue_from Exception, with: :handle_500 unless Rails.env.development?
 def handle_500(exception = nil)
   logger.error "Rendering 500 with exception: #{exception.message}" if exception
   ExceptionNotifier.notify_exception(exception, env: request.env, data: {message: "error"})
   respond_to do |format|
     format.html {
       return render template: 'errors/error_500', status: 500, layout: false, content_type: 'text/html'
     }
     format.all {
       return head :internal_server_error
     }
   end
 end
end
```
## 実現したいこと
ご教示いただけることがあれば、何卒よろしくお願いいたします。
  • Ruby

    10204 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    9548 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2566 questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • Server

    241 questions

2 情報追加

s_diff

s_diff score 101

2019/01/10 15:01  投稿

[Ruby On Rails]renderやredirect_toを使っていないのにAbstractController::DoubleRenderError
ローカル環境や本番環境では問題ないのですが、staging環境でのみDoubleRenderErrorが出ます。
エラーメッセージの最後にredirect_to(...) and returnとあるのですが、このアクション内にはredirect_toもrenderもないため、別のところに問題があると推測しています。
おそらくサーバーが立ち上がらなくなってから復旧した際の処理の何かが引っかかったのだと思います。
## エラー全文
AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".):
## 環境
macOS High Sierra(バージョン10.13.6)
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin17]
Rails 4.2.6
##試したこと
以下のようにproduct_controllerのdownloadzipアクションにデバッグを追加してログを確認してみました。
```ruby
# product_controller.rb
def downloadzip
   @product = Product.find_by(id: params[:id])
   download_cnts = DownloadLog.where(user_id: current_user.id).current_month.count
   plan = current_user.enable_download_plan
   logger.debug("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
   return if download_cnts >= plan.download_limit
   logger.debug("bbbbbbbbbbbbbbbbbbbbbbbbbbbb")
   file_path = set_zip_url(@product)
   logger.debug("cccccccccccccccccccccccccccccccc")
   ActiveRecord::Base.transaction do
     logger.debug("dddddddddddddddddddddddddddddddd")
     file_download(file_path, "livesearch")
     logger.debug("eeeeeeeeeeeeeeeeeeeeeeeeeeeeee")
     logger.debug(current_user)
     logger.debug("ffffffffffffffffffffffffffffff")
     logger.debug(@product)
     logger.debug("ggggggggggggggggggggggggggggggggg")
     DownloadLog.create(user_id: current_user.id, product_id: @product.id)
     logger.debug("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")
   end
 end
```
staging.logでログを確認すると、
logger.debug("ggggggggggggggggggggggggggggggggg")までは問題ないようですが、logger.debug("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")がなく、DownloadLog.create(user_id: current_user.id, product_id: @product.id)の部分でエラーが起きているようです。
```
# staging.log
D, [2019-01-10T03:13:33.310428 #9193] DEBUG -- : ggggggggggggggggggggggggggggggggg
D, [2019-01-10T03:13:33.315289 #9193] DEBUG -- :  ESC[1mESC[36mProduct Load (0.3ms)ESC[0m ESC[1mSELECT `products`.* FROM `products` WHERE `products`.`id` = 67 LIMIT 1ESC[0m
D, [2019-01-10T03:13:33.316273 #9193] DEBUG -- :  ESC[1mESC[35m (0.2ms)ESC[0m SELECT COUNT(*) FROM `download_logs` WHERE `download_logs`.`product_id` = 67
D, [2019-01-10T03:13:35.683743 #9193] DEBUG -- :  ESC[1mESC[36m (0.1ms)ESC[0m ESC[1mROLLBACKESC[0m
E, [2019-01-10T03:13:35.684035 #9193] ERROR -- : Rendering 500 with exception: undefined method `[]' for nil:NilClass
I, [2019-01-10T03:13:35.947113 #9193] INFO -- : Completed 500 Internal Server Error in 3226ms (ActiveRecord: 8.6ms)
F, [2019-01-10T03:13:36.198009 #9193] FATAL -- :
AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".):
 app/controllers/application_controller.rb:51:in `block (2 levels) in handle_500'
 app/controllers/application_controller.rb:49:in `handle_500'
```
Rendering 500 with exception: undefined method `[]' for nil:NilClassとありますが、[]を記述していないので、なぜこのエラーができているのかわかりません。model/download_log.rbにも記述はありませんでした。
Rendering 500 with exception: undefined method `[]' for nil:NilClassとありますが、[]を記述していないので、なぜこのエラーができているのかわかりません。model/download_log.rbにもapplication_controller.rbのhandle500にも記述はありませんでした。
```ruby
# model/download_log.rb
class DownloadLog < ActiveRecord::Base
 belongs_to :user, foreign_key: 'user_id'
 belongs_to :product, foreign_key: 'product_id'
 scope :current_month, -> { where(created_at: Time.current.beginning_of_month..Time.current.end_of_month) }
 before_save :set_dl_cnt_to_product
 def set_dl_cnt_to_product
   self.product.update(dl_cnt: DownloadLog.where(product_id: self.product.id).count + 1)
 end
end
```
```ruby  
# application_controller.rb  
 
class ApplicationController < ActionController::Base  
 protect_from_forgery with: :exception  
 rescue_from Exception, with: :handle_500 unless Rails.env.development?  
 
 def handle_500(exception = nil)  
   logger.error "Rendering 500 with exception: #{exception.message}" if exception  
   ExceptionNotifier.notify_exception(exception, env: request.env, data: {message: "error"})  
   respond_to do |format|  
     format.html {  
       return render template: 'errors/error_500', status: 500, layout: false, content_type: 'text/html'  
     }  
     format.all {  
       return head :internal_server_error  
     }  
   end  
 end  
end  
```  
 
## 実現したいこと
staging環境のみで問題が起こる原因を究明したいです。
ご教示いただけることがあれば、何卒よろしくお願いいたします。
  • Ruby

    10204 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    9548 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2566 questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • Server

    241 questions

1 情報追加

s_diff

s_diff score 101

2019/01/10 14:10  投稿

[Ruby On Rails]renderやredirect_toを使っていないのにAbstractController::DoubleRenderError
ローカル環境や本番環境では問題ないのですが、staging環境でのみDoubleRenderErrorが出ます。
エラーメッセージの最後にredirect_to(...) and returnとあるのですが、このアクション内にはredirect_toもrenderもないため、別のところに問題があると推測しています。
おそらくサーバーが立ち上がらなくなってから復旧した際の処理の何かが引っかかったのだと思います。
## エラー全文
AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".):
 
## 環境  
macOS High Sierra(バージョン10.13.6)  
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin17]  
Rails 4.2.6  
##試したこと
以下のようにproduct_controllerのdownloadzipアクションにデバッグを追加してログを確認してみました。
```ruby
# product_controller.rb
def downloadzip
   @product = Product.find_by(id: params[:id])
   download_cnts = DownloadLog.where(user_id: current_user.id).current_month.count
   plan = current_user.enable_download_plan
   logger.debug("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
   return if download_cnts >= plan.download_limit
   logger.debug("bbbbbbbbbbbbbbbbbbbbbbbbbbbb")
   file_path = set_zip_url(@product)
   logger.debug("cccccccccccccccccccccccccccccccc")
   ActiveRecord::Base.transaction do
     logger.debug("dddddddddddddddddddddddddddddddd")
     file_download(file_path, "livesearch")
     logger.debug("eeeeeeeeeeeeeeeeeeeeeeeeeeeeee")
     logger.debug(current_user)
     logger.debug("ffffffffffffffffffffffffffffff")
     logger.debug(@product)
     logger.debug("ggggggggggggggggggggggggggggggggg")
     DownloadLog.create(user_id: current_user.id, product_id: @product.id)
     logger.debug("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")
   end
 end
```
staging.logでログを確認すると、
logger.debug("ggggggggggggggggggggggggggggggggg")までは問題ないようですが、logger.debug("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")がなく、DownloadLog.create(user_id: current_user.id, product_id: @product.id)の部分でエラーが起きているようです。
```
# staging.log
D, [2019-01-10T03:13:33.310428 #9193] DEBUG -- : ggggggggggggggggggggggggggggggggg
D, [2019-01-10T03:13:33.315289 #9193] DEBUG -- :  ESC[1mESC[36mProduct Load (0.3ms)ESC[0m ESC[1mSELECT `products`.* FROM `products` WHERE `products`.`id` = 67 LIMIT 1ESC[0m
D, [2019-01-10T03:13:33.316273 #9193] DEBUG -- :  ESC[1mESC[35m (0.2ms)ESC[0m SELECT COUNT(*) FROM `download_logs` WHERE `download_logs`.`product_id` = 67
D, [2019-01-10T03:13:35.683743 #9193] DEBUG -- :  ESC[1mESC[36m (0.1ms)ESC[0m ESC[1mROLLBACKESC[0m
E, [2019-01-10T03:13:35.684035 #9193] ERROR -- : Rendering 500 with exception: undefined method `[]' for nil:NilClass
I, [2019-01-10T03:13:35.947113 #9193] INFO -- : Completed 500 Internal Server Error in 3226ms (ActiveRecord: 8.6ms)
F, [2019-01-10T03:13:36.198009 #9193] FATAL -- :
AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".):
 app/controllers/application_controller.rb:51:in `block (2 levels) in handle_500'
 app/controllers/application_controller.rb:49:in `handle_500'
```
Rendering 500 with exception: undefined method `[]' for nil:NilClassとありますが、[]を記述していないので、なぜこのエラーができているのかわかりません。model/download_log.rbにも記述はありませんでした。
```ruby
# model/download_log.rb
class DownloadLog < ActiveRecord::Base
 belongs_to :user, foreign_key: 'user_id'
 belongs_to :product, foreign_key: 'product_id'
 scope :current_month, -> { where(created_at: Time.current.beginning_of_month..Time.current.end_of_month) }
 before_save :set_dl_cnt_to_product
 def set_dl_cnt_to_product
   self.product.update(dl_cnt: DownloadLog.where(product_id: self.product.id).count + 1)
 end
end
```
## 実現したいこと
staging環境のみで問題が起こる原因を究明したいです。
ご教示いただけることがあれば、何卒よろしくお願いいたします。
  • Ruby

    10204 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    9548 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2566 questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • Server

    241 questions

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る