2016-04-13 36 views
1

Piggybacking off this question我在第二次問前,在我的應用程序中有一些日期滾動器。因爲URL的結構是這樣/firefighter/dashboard/11-08-2016如果你想看看在那個特定的日期,在登錄時其實我保存這樣的用戶「類型」等按鈕的代碼如下:當登錄用戶更改URL的基礎時管理URL

a.button href="/#{session[:user_type]}/dashboard/#{yesterday}" 

這似乎令人尷尬錯誤,但有許多用戶共享許多頁面,同時擁有不同的權限,這真的讓我失望了。我想重構它,所以它不瘋狂。

替代方案不可能使每個用戶的菜單局部化?

謝謝!

+0

消防隊員,隊長和隊長模型有何不同?通常情況下,您將擁有一個用戶模型,並通過書面屬性區分用戶的「類型」。 –

+0

@PetrGazarov他們都從用戶類繼承,但他們每個人都有個人的儀表板,帳戶選項和設置等,我只是不知道如何組織路由,以便它不是這樣一個爛攤子。 –

+0

或者,您可以爲您的特定情況編寫路徑助手。例如,current_user_dashboard_path'link_to'鏈接到儀表板',current_user_dashboard_path(昨天)'。在助手內部,您可以找到當前登錄的用戶並返回相應的url。 –

回答

1

據我瞭解你的問題:你正試圖創建特定於角色的URL。
我通常使用Rolify gem來維護角色,並使用它的功能在我的代碼中查找該用戶的角色。

你可以做這樣的事情:

1)假設你正在創建模型的用戶,創建一個應用程序/庫/ dynamic_router.rb

class DynamicRouter 
    def self.load 
    ComingSoon::Application.routes.draw do 
     User.all.each do |pg| 
     puts "Routing #{pg.roles.first}" 
     get "/dashboard", :to => "#{pg.roles.first}#dashboard", :as => "#{pg.roles.first}_dashboard" 
     end 
    end 
    end 

    def self.reload 
    ComingSoon::Application.routes_reloader.reload! 
    end 
end 

有了這個,你可以調用所有的儀表盤像這樣的角色: firefighters_dashboard_path或police_dashboard_path。

2)讓UserController的瞭解你的動態路由器:

class UserController < ActiveRecord::Base 

    before_action :reload_routes 

    def reload_routes 
    DynamicRouter.reload 
    end 
end 

3),以獲得動態路由生成,配置/ routes.rb中文件編輯與調用替換包羅萬象的路線從DynamicRouter.load

ComingSoon::Application.routes.draw do 
    root 'home#index' 
    get 'not_found' => 'users#not_found' 
    DynamicRouter.load 
end 

我已經採取了參考 - http://codeconnoisseur.org/ramblings/creating-dynamic-routes-at-runtime-in-rails-4 你能在那裏找到更多的細節。

我希望這有助於!

0

我不確定這是否會回答你的問題,但如果我正確理解你,你正試圖乾燥/重構你的路線/控制器。我會組織這樣的路線如下:

Rails.application.routes.draw do 

    POSSIBLE_ROLES = ['firefighter', 'chief', 'captain'] 
    scope "/:role", defaults: {role: 'firefighter'}, constraints: { role: /#{POSSIBLE_ROLES.join("|")}/ } do 
    get "/foo", :to => "controller#action", :as => :foo 
    end 

end 

的路由助手會的工作是這樣的:

foo_path # -> /firefighter/foo 
foo_path(:role => 'chief') # -> /chief/foo 
foo_path(:role => 'something') # throws ActionController::UrlGenerationError 

你可以通過params[:role]訪問你的控制器的電流值,你可以只覺得一定傳遞有效值。

編輯:

這也許值得一提的,是調用一個網址像/something/foo也將導致路由錯誤(404)。

0

我打算做兩個假設。如果這些不都是真的,那麼很可能以後的建議是不是超級有用:

  • 你的用戶的不同角色有儀表板和其他網頁一般行爲相同
  • 哪裏有變化,這是因爲有些用戶能夠處理其他用戶不具備的某些功能,而這主要是爲了讓某些用戶在視圖中顯示其他用戶不具備的額外組件。

在這種情況下,我認爲你可以通過簡單的角色&權限系統得到很好的服務。用戶可以有許多角色,並且每個角色都有許多與其關聯的特權。如此,用戶具有特定的一組特權。

考慮到這一點,只有某些用戶可以使用視圖的組件,將它們放入局部視圖中,然後將局部視圖包含在條件中,以檢查用戶是否具有與使用該視圖相關的權限。一般來說,我建議儘可能檢查用戶是否有特定的權限;這樣你可以自由地改變與角色相關的權限,而不用擔心你在其他地方打破了大量的邏輯。

如果有應該有有限的訪問某些控制器的操作,您可以使用before_action方法來驗證用戶是否具有正確的權限,然後再繼續。

像這樣的方法,可以幫助保持你的路由文件清除和你的控制器和視圖免費不必要的重複。

0

在這種情況下,單一職責原則是比干好。 在每個角色的路由和不同接口中使用名稱空間。

namespace :firefighter do 
    resource :dashboard, only: :show, controller: :dashboard 
end 
namespace :chefs do 
end 

在視圖中的相似部分,你可以移動到partials「app/views/shared」。日期作爲參數使用,不在路徑中使用。代碼將比動態路由更容易理解。