2012-11-30 76 views
3

我想是這樣的:如何檢查軌道路線存在在視圖中

if has_route?(:controller => 'posts', :action => 'index') 
    ... 

我怎樣才能在視圖中做到這一點?

---- ----解決方案

def has_route? options 
    Rails.application.routes.routes.map{|route| route.defaults}.include?(options) 
end 
+0

你想測試這條路線嗎? – megas

+0

是的。我有一個散列,我想檢查一個路線的存在。 –

回答

1

我知道這是那種你想要的逆的,但你可以做這樣的事情:

Rails.application.routes.recognize_path('/posts')

將返回一個像這樣的哈希:

{:controller=>"posts", :action=>"index"}

但我不知道給它散列並返回路徑的API。

您可以通過ActionDispatch::Routing::RouteSet API查看。

此外,請注意,Rails.application.routes.routes返回一個Journey :: Routes對象數組,因此您可以將此數組用於您想要的控制器/動作配對。但似乎這個API應該已經存在。如果沒有,也許它應該。 :)

+0

我已經看過了,不幸的是我沒有找到recognition_path的反向方法。 –

+0

寫一個,並做一個拉請求。 :) – ipd

+2

是的。我找到解決方法,謝謝。 Rails.application.routes.routes.map {|路線| route.defaults} .include?({:controller =>'posts',:action =>'index'})---> true –

0

你可以嘗試像respond_to?("[name of rails routing method]")

+0

如何檢查一個散列,而不是一個字符串,而不是一個方法的存在:) –

+0

意圖實際上是檢查基於路線(如controller_action_path())的rails方法的存在,但我看到你在說什麼。你可以創建一個包裝url_for([你的散列])的幫助函數並捕獲路由錯誤。如果出現錯誤,則不存在路徑,否則就是。 –

+0

我已經想過了,但希望有一個現成的解決方案。 –

0

通常路由測試以這種方式

it "routes to #index" do 
    get("/projects").should route_to("projects#index") 
end 

資源的支架將產生例如你可以看看here

+0

我的問題在視圖中使用,而不是用rspec進行測試。我想用這個來幹我的看法。 –