2011-11-21 92 views
3

我有一些動態加載的插件,它們在啓動時註冊它們的路由,但是我也需要能夠在它們被禁用時刪除它們的路由。有沒有辦法刪除現有的路線?如何從Sinatra中刪除路線?

該API沒有任何方法可以刪除它們,而我唯一能想到的方法是右轉到Sinatra :: Base中的@routes對象,但我不是當然,如果你能做到這一點,並且如果你能......做到這一點是安全的嗎?

回答

3

通過代碼尋找一個幾分鐘,我看不出有任何的代碼,「破壞性」變異比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的內部在最近的版本中已經發生了變化,所以我不會依賴這個工具,而不用每個新版本都進行測試。更好的是,建議一個補丁,看看你是否能夠接受併入主庫的功能。

+0

位愚蠢的問題,但你打算如何在github上一個補丁?你提出一個問題,只是詳細說明你想要的功能,或者我應該拿一個分支,自己添加功能,然後以某種方式通知他們我已經做出了改變?如果這是一個漫長的回答,只是這麼說,我會去網上查看關於github的一些信息,因爲我沒有用過那麼多。 – Grofit

+1

你可以從一個問題開始。將Sinatra分叉,做出自己的改變(確保你有測試用例和文檔),將它們推回到你的GitHub分支,然後使用GitHub的「Pull Request」功能來請求它們合併你的改變通常更容易。閱讀更多[這裏](http://help.github.com/send-pull-requests/)。 – Phrogz

+0

謝謝,我到家後會去詳細瞭解一下 – Grofit

0

您可以通過設置after塊來阻止路由返回任何內容。

2

可能是你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 
+0

這是一種可能性,但我想刪除它們的原因是因爲我有一個插件樣式系統,所以如果一個插件被卸載,我想完全刪除路線來自系統。你是對的,但這是解決問題的辦法。 – Grofit