我有一些動態加載的插件,它們在啓動時註冊它們的路由,但是我也需要能夠在它們被禁用時刪除它們的路由。有沒有辦法刪除現有的路線?如何從Sinatra中刪除路線?
該API沒有任何方法可以刪除它們,而我唯一能想到的方法是右轉到Sinatra :: Base中的@routes對象,但我不是當然,如果你能做到這一點,並且如果你能......做到這一點是安全的嗎?
我有一些動態加載的插件,它們在啓動時註冊它們的路由,但是我也需要能夠在它們被禁用時刪除它們的路由。有沒有辦法刪除現有的路線?如何從Sinatra中刪除路線?
該API沒有任何方法可以刪除它們,而我唯一能想到的方法是右轉到Sinatra :: Base中的@routes對象,但我不是當然,如果你能做到這一點,並且如果你能......做到這一點是安全的嗎?
通過代碼尋找一個幾分鐘,我看不出有任何的代碼,「破壞性」變異比routes
其他:
C:\Ruby\lib\ruby\gems\1.9.1\gems\sinatra-1.3.1\lib\sinatra\base.rb:
936 def reset!
937 @conditions = []
938: @routes = {}
939 @filters = {:before => [], :after => []}
940 @errors = {}
這是一個「核彈從軌道上」的做法,想必也不是什麼你需要。根據這項調查,我認爲你需要自己修改routes
散列。
對於當前代碼版本,這看起來「安全」對我來說,只要該route!
方法始終查找路線的當前數組和遍歷他們通常(沒有緩存):
def route!(base = settings, pass_block=nil)
if routes = base.routes[@request.request_method]
routes.each do |pattern, keys, conditions, block|
pass_block = process_route(pattern, keys, conditions) do |*args|
route_eval { block[*args] }
end
end
end
# Run routes defined in superclass.
if base.superclass.respond_to?(:routes)
return route!(base.superclass, pass_block)
end
route_eval(&pass_block) if pass_block
route_missing
end
圍繞存儲路線的Sinatra的內部在最近的版本中已經發生了變化,所以我不會依賴這個工具,而不用每個新版本都進行測試。更好的是,建議一個補丁,看看你是否能夠接受併入主庫的功能。
您可以通過設置after塊來阻止路由返回任何內容。
可能是你condider這種方法,
before '/the_path_you_want_to_remove' do
redirect '/the_path_is_default_page_or_someting'
end
你可以把這個before
行動壓倒一切的要刪除的路線,所以路線不能被訪問和執行。
如果要再次啓用該路線,只需刪除before
操作。
或刪除陣列項目disable_routes
before do
disable_routes = ['/test', '/test/*', '/test*']
redirect '/default_page' if disable_routes.include?(request.path_info)
end
這是一種可能性,但我想刪除它們的原因是因爲我有一個插件樣式系統,所以如果一個插件被卸載,我想完全刪除路線來自系統。你是對的,但這是解決問題的辦法。 – Grofit
位愚蠢的問題,但你打算如何在github上一個補丁?你提出一個問題,只是詳細說明你想要的功能,或者我應該拿一個分支,自己添加功能,然後以某種方式通知他們我已經做出了改變?如果這是一個漫長的回答,只是這麼說,我會去網上查看關於github的一些信息,因爲我沒有用過那麼多。 – Grofit
你可以從一個問題開始。將Sinatra分叉,做出自己的改變(確保你有測試用例和文檔),將它們推回到你的GitHub分支,然後使用GitHub的「Pull Request」功能來請求它們合併你的改變通常更容易。閱讀更多[這裏](http://help.github.com/send-pull-requests/)。 – Phrogz
謝謝,我到家後會去詳細瞭解一下 – Grofit