【发布时间】:2016-11-01 19:23:34
【问题描述】:
在我的一个 Rails 应用程序控制器中,我做了这样的事情:
def create
@user = User.create(user_params)
# send welcome email
UserMailer.welcome(@user).deliver_later
end
现在,我有意禁用了我的 Redis 服务器,以便我可以复制无法从我的应用建立连接时会发生的情况。
很遗憾,如果 deliver_later 无法连接到 Redis,则整个 create 请求将失败并返回 500。
我想要的是请求仍然成功,但邮件程序默默地失败了。
我怎样才能做到这一点?
其他信息:
在 config/initializers/action_mailer.rb:
rescue_from(Redis::CannotConnectError) do |exception|
Rails.logger.error "Original record not found: #{@serialized_arguments.join(', ')}"
end
尽管出现异常,但它永远不会被调用。我尝试了rescue_from(StandardError) 和(Exception),但也从未调用过。
我使用 sidekiq 作为我的作业队列适配器:
config.active_job.queue_adapter = :sidekiq
我得到的 500 错误是:
Redis::CannotConnectError (Error connecting to Redis on localhost:6379 (Errno::ECONNREFUSED)):
我的UserMailer 是ApplicationMailer 的子类,ActionMailer::Base 的子类。
【问题讨论】:
-
为什么不简单地挽救异常?
-
@user3033467 在哪里?我在整个应用程序中都有 Deliver_later 代码,所以想从一个地方完成。
-
我不知道有任何方法可以在不使用猴子补丁或引入外观的情况下全局捕获该错误。
标签: ruby-on-rails actionmailer sidekiq