代码之家  ›  专栏  ›  技术社区  ›  amit_saxena

如何在我的代码库中忽略/抑制特定类型的异常(activerecord::readonlyrecord)

  •  1
  • amit_saxena  · 技术社区  · 7 年前

    我正在尝试创建应用程序的只读版本,并对activerecord::base进行了monkey补丁,以便它返回 true 对于 readonly? 所有型号:

    module ActiveRecord
      class Base
        def readonly?
          true
        end
      end
    end 
    

    这将导致 ActiveRecord::ReadOnlyRecord 在我试图写入数据库的任何地方都会引发异常。有没有一种方法可以忽略这个异常,不管它在代码中出现在什么地方,然后继续执行代码。以某种方式重写异常类,使其不执行任何操作,即异常被抑制。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Panic    7 年前

    您可以尝试以下方法,而不是将所有模型都设置为只读:

    class ApplicationRecord < ActiveRecord::Base
      before_commit do
        raise ActiveRecord::Rollback, 'Read-only'
      end
    end
    
        2
  •  0
  •   wiesion    6 年前

    假设

    • 所有模型都继承自一个自定义 ApplicationRecord
    • 你利用了验证
    • 通过url访问模型的所有接口都不会跳过验证
    • 您希望对只读版本使用完全相同的源代码

    我建议您使用全局验证,它检查是否存在环境变量,我们称之为 MY_APP_IS_READ_ONLY :

    application_record.rb

    class ApplicationRecord < ActiveRecord::Base
      # your code ...
      validates :not_read_only_mode
      def not_read_only_mode
        errors.add(:base, "App runs in read-only mode") unless ENV['MY_APP_IS_READ_ONLY'].nil?
      end
    

    现在,所有继承的模型都应该通过验证,并且在 .save 它们被重定向到同一个url(取决于您的代码),无法创建或更新任何记录。也可以通过指定 :base 作为错误源,您将创建一个不绑定到任何字段的通用错误消息。

    但是,如果您有需要更新的模型(会话?上次登录的用户?),您应该创建一个单独的类来保存此验证,并使条件只读模型从中继承。

        3
  •  0
  •   Jason Ormes    6 年前

    您可以在应用程序控制器中挽救异常并忽略它。