2012-05-02 23 views

回答

4

當然!

redirect_to send("#{user.role}_url") 

在Ruby中,發送將執行接收機上的方法,而這正是你想要的。通常情況下,這將是這樣的:

@receiver_object.send(:admin_url) 

但在全局命名空間的網址助手的工作,這樣你就可以發送給全球和它的工作。

測試簡單的方法:這個添加到控制器,看着它重定向你回家:

redirect_to send("root_path") 
+0

真棒,send()方法是我失蹤。 –

0

您可以使用render "#{user.role}"。只要確保有名稱爲admin.html.erb的相應視圖等等。

+0

我真的認爲redirect_to在這裏更合適。看起來他在概念上會通過一個新的URL進入一個新頁面。 –

+0

我試過這個,但是它導致連接丟失,就像我試圖做標題和我的問題時一樣。有沒有更好的方式來做到這一點,當我有views/admin/index.html.erb –

0

有幾件事情你可以做,但沒有內置任何東西,會比send("#{user.role}_url")簡單得多。一定要使用send() - 否則它將重定向到URL「/ admin_url」而不是調用admin_url助手。

其中一個這樣的其他解決方案是創建一個名爲'home'的操作,該操作將重定向到current_user的角色頁面。這將添加一個額外的重定向(稍微提高頁面加載時間),但它會使您的重定向簡單

redirect_to home_url 
+0

不幸的是,redirect_to「#{user.role} _url」由於某種原因對我不起作用,它只是在每次我放棄連接時嘗試一下。任何想法,爲什麼它這樣做? –

+0

因爲你傳遞的是字符串「admin_url」而不是方法'admin_url',它被計算到字符串'users/admin'中。 – Andrew

+0

嘗試發送(「#{user.role} _url」)。否則,它會重定向到「/ admin_url」,這不是你想要的。 –

2

也許是最好的辦法是使用url_for幫手。例如。

redirect_to url_for(:controller => users, :action => user.role) 

這將產生/users/admin/users/guest

如果你想這樣做一個hackish的方式,你可以使用

redirect_to eval("#{user.role}_url") 

小心,雖然路徑。你的字符串不工作的原因是它沒有被評估,所以redirect_to "admin_url"不做任何事情,它只是一個沒有意義的字符串,重定向期望字符串是一個URL。

如果你評估它的工作,因爲redirect_to eval("#{user.role}_url")打算先轉換成"admin_url"調用admin_url方法,它返回像users/admin一些路徑的字符串,該字符串是重定向方法可用。

+0

很酷,看起來像發送和評估都爲我的目的工作!我會upvote,但我很新,我不能 –

0

我真的很喜歡安德魯的回答,但你也可以做類似

redirect_to send(user.role.to_s + '_url') 
+0

你當然是對的,發送部分是我錯過的。 –

相關問題