ruby - Sinatra API 功能切换

标签 ruby rest design-patterns sinatra featuretoggle

要点

是否可以将类似功能切换的功能烘焙到 Sinatra 中?申请?

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

背景故事

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

问题

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

问题

我可以用某种 :development 标记来注释这些方法,或者可以在 before block 中拦截请求吗?你会使用助手来做这件事吗?我不确定我是否在沿着正确的道路前进,我可能把它复杂化了(?)

人们会怎么做呢?

如果您做过类似的事情,那么如果您能与全国分享您的发现就太好了。

最佳答案

您可以使用当前环境来决定是否定义一个 Action 。例如:

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 的东西构建经过全面测试和生产就绪的用户权限。 .

关于ruby - Sinatra API 功能切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32807059/

相关文章:

ruby-on-rails - 未应用 ActiveRecord cache_timestamp_format 配置

ruby-on-rails - Rails 3.1 引擎迁移不起作用

java - 将 Neo4j 遍历 JAR 作为 API 运行

rest - 使用Jmeter的HTTP Request将记录放入Amazon Kinesis

javascript - 更改 react 状态的单个变量

C#静态构造函数设计问题——需要指定参数

ruby-on-rails - 对象数组比字符串数组慢得多

javascript - 在松散类型语言的单元测试中,是否应该检查方法的返回类型?

javascript - @Produces( {"application/x-javascript"}) 在 spring mvc 版本 4.0.5.RELEASE 中不起作用

java - 搜索策略以有效地从服务或服务器加载数据?