Sinatra API功能切换

时间:2015-09-27 10:40:40

标签: ruby rest design-patterns sinatra featuretoggle

要点

是否可以将类似功能切换的功能融入Sinatra应用程序?

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

背景故事

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

问题

当我投入生产时,我不希望存在不需要的端点(例如:development)。

问题

我可以使用某种def initialize (htaccess_file_content) @htaccess_hash = Hash.new htaccess_file_content.each_line do | line | @commands = line.split @htaccess_hash[@commands[0]] = @commands[1] end end def auth_name @htaccess_hash['AuthName'].gsub(/''/,"") end 标记来注释方法,或者可以在之前的块中拦截请求吗?你会用帮手做到这一点吗?我不确定我是否正走在正确的道路上,我可能过于复杂了(?)

怎么会这样呢?

如果你做过这样的事情,如果你能与国家分享你的发现,那将是很棒的。

1 个答案:

答案 0 :(得分:3)

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

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