Sinatra API 功能切换
Sinatra API feature toggle
要点
是否可以将类似功能切换的功能烘焙到 Sinatra 应用程序中?
A bit about feature toggles, just in-case ;)
背景故事
我已经建立了一个模块化的 Sinatra 项目,我倾向于为我的所有资源实现一个 GET
/POST
/PUT
/DELETE
端点;它使得在开发过程中测试应用程序和操作数据变得更加容易。
问题
当我投入生产时,我不希望存在不需要的端点(例如 DELETE '/users'
)。
问题
我可以用某种 :development
标志来注释这些方法,或者可以在 before 块中拦截请求吗?你会使用助手来做这件事吗?我不确定我是否走在正确的道路上,我可能过于复杂了(?)
怎么办?
如果您做过类似的事情,如果您能与全国分享您的发现就太好了。
您可以根据当前环境来决定是否定义动作。例如:
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 之类的东西构建经过全面测试和生产就绪的用户权限。 =17=]
要点
是否可以将类似功能切换的功能烘焙到 Sinatra 应用程序中?
A bit about feature toggles, just in-case ;)
背景故事
我已经建立了一个模块化的 Sinatra 项目,我倾向于为我的所有资源实现一个 GET
/POST
/PUT
/DELETE
端点;它使得在开发过程中测试应用程序和操作数据变得更加容易。
问题
当我投入生产时,我不希望存在不需要的端点(例如 DELETE '/users'
)。
问题
我可以用某种 :development
标志来注释这些方法,或者可以在 before 块中拦截请求吗?你会使用助手来做这件事吗?我不确定我是否走在正确的道路上,我可能过于复杂了(?)
怎么办?
如果您做过类似的事情,如果您能与全国分享您的发现就太好了。
您可以根据当前环境来决定是否定义动作。例如:
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 之类的东西构建经过全面测试和生产就绪的用户权限。 =17=]