【问题标题】:Sinatra API feature toggleSinatra API 功能切换
【发布时间】:2015-09-27 10:40:39
【问题描述】:

要点

是否可以将类似功能切换的功能烘焙到 Sinatra 应用程序中?

A bit about feature toggles, just in-case ;)

背景故事

我已经建立了一个模块化的 Sinatra 项目,我倾向于为我的所有资源实现一个GET/POST/PUT/DELETE 端点;它使在开发过程中测试应用和操作数据变得更加容易。

问题

当我投入生产时,我不希望存在不需要的端点(例如 DELETE '/users')。

问题

我可以用某种:development 标志来注释方法,或者可以在前块中拦截请求吗?您会使用助手来执行此操作吗?我不确定我是否走在正确的道路上,我可能过于复杂了(?)

如何处理这个问题?

如果你做过这样的事情,如果你能与全国分享你的发现,那就太好了。

【问题讨论】:

    标签: ruby rest design-patterns sinatra featuretoggle


    【解决方案1】:

    您可以使用当前环境来决定是否定义操作。例如:

    class MyApp < Sinatra::Application
      if settings.development?
        get '/admin' do
          'VIPs only'
        end
      end
    end
    

    如果您有很多要切换的内容,您可能希望将它们隔离在一个文件中,您可以决定是否需要:

    # routes/init.rb
    require_relative 'main'
    require_relative 'debug' if settings.development?
    
    # routes/main.rb
    class MyApp < Sinatra::Application
      get '/' do
        'Hello!'
      end
    end
    
    # routes/debug.rb
    class MyApp < Sinatra::Application
      get '/admin' do
        'VIPs only'
      end
    end
    

    或者如果你想在一个地方列出你的开发路径,这里有一个过滤器版本:

    class MyApp < Sinatra::Application
      DEVELOPMENT_PATHS = %w[
        /admin
      ]
    
      before do
        unless settings.development? || !DEVELOPMENT_PATHS.include?(request.path)
          halt 404 
        end
      end
    end
    

    然后您还可以构建一些类似装饰器的方法添加到列表中:

    class MyApp < Sinatra::Application
      def self.development_only(path)
        DEVELOPMENT_PATHS << path
      end
    
      get '/admin' do
        'VIPs only'
      end
      development_only '/admin
    end
    

    一般来说,在开发中运行的代码与生产中运行的代码之间存在显着差异时,我建议您谨慎行事。不可避免地,开发代码要么未经测试,要么变得难以正确维护。在这种情况下,您可能会错过您打算隐藏的路线,而生产中的每个人都可以使用它。我倾向于完全没有这些路由,而是从控制台操作我的开发环境,或者一直到另一端,并使用sinatra-authentication 之类的东西构建经过全面测试和生产就绪的用户权限。

    【讨论】:

    • 感谢您的全面回答。我正在使用身份验证,我想如果我正在检查管理员凭据,我真的不需要隐藏端点,但我仍然认为另一层封装会很好。在上面展示的 3 种方法中,您会推荐哪一种?
    • 我会选择隔离 debug 文件中的所有内容,因为它非常清楚哪些内容仅适用于开发人员,并且只需一个开关即可使代码完全脱离生产环境。我不喜欢每条路线的if 声明,因为你会有这么多分散在周围。如果您在按资源(用户、帖子等)组织的文件中拥有大量不同的调试路径,那么我会选择装饰器版本。
    • 为此干杯,我对每个路由 if 有相同的想法,它可能会变得混乱。
    猜你喜欢
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    相关资源
    最近更新 更多