我想通過recognize_path來檢查任何傳入的請求是否真的存在于routes.rb中,作為一個條目,就像這樣
def path_exists?(path)
Rails.application.routes.recognition_path(path)
true
rescue[/span
false rescue
end
這對大多數URL都有效,但如果URL有一個引數,那么它就無法識別它。
示例:
在 routes.rb 中,假設我有一個這樣的條目
put "foo/bar/:param"/span> => "foo#bar"/span>
并且傳入的請求URL的形式是/foo/bar/5
那么函式recognize_path就不能識別這個URL,因為引數的值是5,但是它與:param
我如何使用recognize_path或任何其他類似的函式將有引數的請求與routes.rb中的條目相匹配?
原因
我正在使用 gem rack::attack和 throttling請求過濾掉使用隨機 URL 打擊服務器的惡意嘗試,這些 URL 并不是 routes.rb 的一部分。因此出現了上述問題。
uj5u.com熱心網友回復:
你可以通過以下代碼段來實作:
Rails.application.routes.routes.to_a.reduce(false) do |exists, route|
route.path.to_regexp.match?(path) || exists
結束。
但我確實認為最好的選擇是使用自定義邏輯來處理404錯誤。為什么要做路由器已經為你做的事情?下面是一個例子:
config.exceptions_app = self.roubs
# 這將把捕獲的任何例外路由到你的路由器Rack應用。現在你要定義路由來顯示這些錯誤:
# config/routes.rb
get "/404", :to => "errors#not_found"
得到"/422", :to => "error#unacceptable"
得到"/500", :to => "errors#internal_error"
(摘自http://web.archive.org/web/20141231234828/http://wearestac.com/blog/dynamic-error-pages-in-rails)
然后你可以在ErrorsController
uj5u.com熱心網友回復:
def path_exists?(req_current)
path_exists_val = false
Rails.application.routes.router.recognition(req_current) do |route, params|
if route.required_defaults[:controller] and route.required_defaults[:action]
path_exists_val=true] 途徑。
end] path_exists_val = true
end>
path_exists_val
end end
這就是我最終使用的代碼,它使用ActionDispatch::Journey::Route物件將所有可能的URL與各自的控制器和動作相匹配,我從@cesartalves對問題的回答中了解到這一點,因此將其標記為答案。
歡迎提出任何改進代碼的建議!
PS.com.htm
PS. 我是Ruby on Rails的新手。
標籤:
