2015-10-26 94 views
1

我有基於用戶角色的訪問控制。用戶有很多角色。 每個角色都可以訪問一些控制器,操作和範圍。Rails4從模型方法訪問controller_name

我有方法can_control?(控制器)在用戶模型中檢查用戶是否有權訪問特定的控制器。我有類似的行動方法。

然後,在視圖或控制器我可以使簡單的邏輯使用隱藏某些信息或允許訪問:

current_user.can_control?(controller_name) 

不知是否有可能創造在用戶模型,其自動進行CONTROLLER_NAME方法。我試圖在模型中定義方法。

def can_control? 
    self.permitted_cotrollers.include?(controller_name) 
end 

但它給我一個錯誤:

undefined local variable or method `controller_name' for #<User:0x007f00e8ceb928> 

我理解錯誤,但是可以找到解決辦法,或者有可能有一個。

+0

我覺得你還是需要通過控制器的名稱,因爲can_control參數?是一種實例方法,您需要檢查用戶訪問某個控制器的能力。每次您加載不同的視圖時,Controller_name似乎也會更改。爲了便於實施,您可以嘗試使用:https://github.com/CanCanCommunity/cancancan –

+0

恐怕您沒錯。在這個例子中它很容易,但我需要更復雜的方法,我需要使用這個方法,並在每個方法中傳遞它並不像我想的那樣幹。 – rpeczykowski

+0

但我想如果你只是想控制訪問你的視圖和控制器,你可以嘗試'cancancan' gem。我已經嘗試了很多次,並且證明是有效的。 –

回答

0

這裏使用的snake_case名字是我能想到的最好的解決辦法:您可以訪問當前的控制器名來自任何控制器方法的params[:controller]

在用戶模式:

def can_control?(params) 
    self.permitted_controllers.include?(params[:controller]) 
end 

在任何控制器:

current_user.can_control?(params) 
+0

謝謝,我實現了這一點,並運行良好。這簡化了我的申請。 – rpeczykowski

+0

不客氣。我也希望你的'allowed_controllers'列表是你可以爲用戶組設置的,而不僅僅是爲用戶設置的。否則,有一天你可能很難維持系統。 – Caillou

0

在你的模型,你可以得到標準的使用相關的控制器名稱:

"#{self.class.to_s}Controller" 
  • 自我是指你的模型
  • 的.class獲得同級車
  • .to_s同級車轉換爲一個包含類名稱的字符串

如果你需要它寫在snake_case而不是CamelCase中,使用這個:

"#{self.class.to_s.tableize}_controller" 
  • .tableize模型的首字母大寫的名字轉換成你的控制器
+0

self.class在這種情況下總是返回UserController。我想在不同的控制器之間分享它。因此,例如在PostController或Post視圖中,我可以使用白色: 'if can_control?',而不是'if can_control?(controller_name)'。 – rpeczykowski

+0

噢,好的。我以前不明白你的實際需要。我要寫另一個答案。 – Caillou