2012-12-27 19 views
1

我正在Ruby on Rails 3.1.3中開發一個應用程序。我有不同類型的用戶(即管理員,運營商,廣告商等),每個用戶都有一個不同的主頁(或主頁)。我想創建一個路由幫助器,通過使用類似home_path的東西,可以爲當前登錄用戶的主頁提供相應的路由。這主要是在某些操作後重定向(我想根據用戶類型重定向回各個主頁)。Rails 3:如何根據對象屬性或方法創建一個可以生成不同路由的路由幫助器?

我已經有一些可用的方法,如current_user現在,我使用(返回登錄用戶的電流),current_user.admin?(如果登錄用戶當前爲admin返回true),current_user.operator?

一個輔助方法來做到這一點,但它似乎不是一個非常Rails的方式來做到這一點。代碼如下反正:

def home_path(params = {}) 
    user = current_user 
    case user 
     when user.admin? 
      params = {:controller => 'administrators', :action => 'index'}.merge(params) 
     when user.advertiser? 
      params = {:controller => 'advertisers', :action => 'show', :id => user.advertiser_id}.merge(params) 
     when user.operator? 
      params = {:controller => 'callcenter', :action => 'index'}.merge(params) 
     else 
      params = {:controller => 'posts', :action => 'home'}.merge(params) 
    end 
    url_for(params) 
end 

我想這應該與約束路由來完成,但我仍然不明白它如何完成依賴於.admin?.operator?等方法。任何幫助,將不勝感激。

+0

這實際上相當不錯。 – MurifoX

回答

2

使用輔助方法很好。它可能最終會在你的控制器中,而不是一個視圖助手,這使得它可以訪問current_user。隨着一些清理,你可以用現在的相同想法得到一些不壞的東西。

module DefaultHomeHelper 
    DEFAULT_PARAMS = { controller: :posts, action: :home }.freeze 
    ROLE_SPECIFIC_PARAMS = { 
    admin: { controller: :administrators, action: :index }, 
    advertiser: { controller: :advertisers, action: :show }, 
    operator: { controller: :callcenter, :action: :index } 
    }.freeze 

    def home_path(params = {}) 
    url_for params.reverse_merge(ROLE_SPECIFIC_PARAMS[current_user.role] || DEFAULT_PARAMS) 
    end 
end 

我讓你可以更直接,問你的用戶對象只是告訴你它的作用,而不是猜測一個接一個的假設。您幾乎可以肯定需要調整代碼以適應您在用戶中調用此內容的任何內容。我也使用了更新的哈希語法,但是如果您正在運行或適應Ruby < 1.9,則需要更新。因爲我喜歡用符號而不是字符串(而控制器和動作是對象和方法)來引用對象和方法,所以我也使用了符號作爲動作和控制器名稱。

你可以在你的ApplicationController中做一個簡單的include DefaultHomeHelper來使用它。您還可以通過helper_method :home_path將其提供給您的觀點。

+0

優秀!我將它更改爲控制器內的模塊,而不是包含視圖助手。我也會用你建議的語法,看起來很整潔。非常感謝你。 –