2011-04-13 25 views
0

如果用戶是藝術家,我想設置路線。因此,舉例來說,如:如果用戶是藝術家,路線取決於

namespace 'dashboard' do 
    if current_user.is_artist 
     get '/settings', :to => 'users#edit', :as => 'account_settings' 
     put '/settings', :to => 'users#update', :as => 'account_settings' 
     delete '/settings', :to => 'users#destroy', :as => 'account_settings' 
    else 
     get '/settings', :to => 'artists#edit', :as => 'account_settings' 
     put '/settings', :to => 'artists#update', :as => 'account_settings' 
     delete '/settings', :to => 'artists#destroy', :as => 'account_settings' 
    end 
end 

不幸的是,我無法訪問routes.rb中的current_user。但是,上述代碼的邏輯解釋了我的意圖。

有沒有辦法實現這個目標?

+0

您應該刪除這個邏輯到應用控制器級別 – fl00r 2011-04-13 11:20:53

回答

0

路由表不運行在特定用戶的上下文中。這是因爲它在到達會話管理代碼之前路由請求,所以它不能分辨誰是當前用戶。

我能想到的兩種解決方案:

  1. 渲染設置通過一些重寫他們,如果用戶是一位藝術家方法鏈接。這樣「藝術家」和「用戶」可以獲得不同的網址。
  2. 將一個before_filter添加到您的UserSettings控制器,該控制器捕獲來自藝術家的請求並將其重定向到ArtistSettings(不確定您的內部結構,但您可能會得到一般想法)。
+0

是啊,這似乎工作,除了我的URL現在看起來類似於http://本地主機/儀表板/藝術家/ 1 /編輯而不是http://本地主機/儀表板/設置。我想的網址是http://本地主機/儀表板/供藝術家和用戶 – 2011-04-13 11:46:58

+0

設置那麼你可能不得不採取另一條路線:)使用一個控制器來支持,並讓您的公共方法調用基於不同的私有方法用戶是否是藝術家。不是我推薦的第一個設計,但很簡單,並且爲兩者保留一個路由端點。 – Elad 2011-04-13 15:25:46

+0

BTW,爲什麼某些重要的是使用相同/儀表/設置終點爲所有用戶?像/儀表板/設置/藝術家和儀表板/設置/用戶有什麼問題? – Elad 2011-04-13 15:26:38

0

從你看起來你已經設置了一個叫做藝術家的角色。所有你需要做的,讓您的使用current_user方法的工作是:在您的帳戶控制器,你可以設置一個過濾器之前好像說的before_filter:check_user_role:只=>:account_setting。那麼你會設置你的account_settings爲各種角色和他們的各種redirects_to調用你有。我正在研究一個類似的項目,它適用於我。我希望這可以幫助你

0

您可以創建一箇中間件,該中間件可以在用戶遇到實際應用程序之前計算出某個級別上的用戶。例如,這是監督員/設計師正在做的事情。將用戶對象添加到env變量中,您可以在堆棧中較低的位置訪問它。

0

您的路由文件只根據URL確定調用哪個控制器操作。您可以將藝術家和用戶都映射到單個控制器,並通過查看用戶來將要在其中呈現屏幕的邏輯放置在該控制器中。默認情況下,控制器渲染是基於控制器和控制方法的名稱的觀點,但你可以自由地覆蓋這個和渲染任何你想要的視圖。用你的路線將請求分派到相應的編輯/更新/銷燬行動,並把你的用戶/藝術家邏輯到那些動作以呈現用戶/ edit.html.haml或藝術家/ edit.html.haml文件...

0

正如Elad所解釋的,路由本身並不能分辨當前用戶是否是藝術家。

如果你想保留一個網址有兩個型動物的行爲和觀點,您可以用單個控制器,如去:

def settings 
    if current_user.is_artist 
     do something 
     render :action => "artist_settings" 
    else 
     do something else 
     render :action => "users_settings" 
    end  
end 
相關問題