2016-09-08 50 views
0

TL; DR;獲取路由資源的映射路徑,因爲它在routes.rb中

有沒有辦法像使用routes.rb聲明的那樣獲取一個帶有資源映射的字符串,包括params的名字?例如:

/resource/:id/nested/:nested_id/deep/:deep_id 
/resource/:id/nested/:nested_id 
/resource/:id 

我需要這個字符串,並打算手動替換參數,可以或許與地圖狀{id: 1, nested_id:2, deep_id: 3}

原因

我有一個整合,我會收到這樣的:

resource:deep_resource, resource_id:1, extra_args: {id: 1, nested_id:2} 

resource:nested_resource, resource_id:1, extra_args: {id: 1} 

resource:first_level_resource, resource_id:1, extra_args: {} 

我打算替換值的URL和重定向到給定的資源。也許用extra_args貼圖自動填充到url中的匹配參數。

我不想做了很多的if/else調用deep_resource_path(a,b,c)nested_resource_path(a,b)first_level_resource_path(a)

注意,對於較深的資源,我需要2個ARGS(祖父母ID和父ID)。對於嵌套的資源,我只需要父ID和first_level資源,我只需要它自己的Id。

那麼,有可能嗎?

謝謝。

ps .:我認爲帶args的地圖有更好的選項,然後接收或硬編碼de url來重定向每個資源。所以,如果將來URL更改,但保持相同的參數,重定向可以繼續工作。

回答

1

如果你拉的路線網址助手:

include Rails.application.routes.url_helpers 

然後,您可以訪問路徑和URL助手直接拿這個字符串。例如,在運行時rake routes給出以下輸出:

user GET /users/:id(.:format)  users#show 

您可以使用user_path(a_user)user_url(a_user)助手:

[8] pry(main)> user_path(user_with_id_7) 
=> "https://stackoverflow.com/users/7" 
[9] pry(main)> user_url(user_with_id_7) 
=> "http://localhost:3000/users/7" 
[10] pry(main)> 
+0

這僅適用於「新」的網址。當試圖獲取resource_path(show)的url時,它要求我傳遞一個id。但是我想訪問像/ condominios /:id這樣的內容,用地圖插入參數並調用de url。如果它是re​​source_a_path或resource_b_path,我不需要新建。可能嗎? –

+0

我想我不明白爲什麼你不會只使用顯示路徑版本,在我的例子中這將是'user_path'並傳入用戶對象。插值是不是重塑了Rails框架的輪子?我將編輯我的答案以顯示'show'情況。 – jaydel

+0

它可以工作,但是一旦我有一張表導致多個資源,例如用戶,帖子和評論,我想到的是做這樣的事情:「這行代表什麼資源?評論?我顯示評論的URL並插入這些參數,然後重定向「。 要按照您的建議操作,我需要執行if/else以使用user_url,post_url或comments_url。而就我而言,我也嵌套了資源。 但我會做一些測試.... –