2012-10-28 31 views
2

我有這個着名的錯誤:「undefined method`current_user'」與聲明性授權,雖然我在application_controller.rb中設置了這個變量:Devise + Declarative_authorization + role_model +不同的用戶模型名稱:未定義的方法`current_user'

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    before_filter :set_current_user 

    protected 

    def set_current_user 
     Authorization.current_user = current_admin_utilisateur 
    end 
end 

我使用了一個名爲 「admin_utilisateurs」,而不是 「用戶」 表。這是在設計中激活:「rails generate devise admin_utilisateur」

設計工作的很好

有關信息,我使用「roles_model」gem自定義了我的用戶表(admin_utilisateurs),以便我擁有一個attribut roles_mask,它允許我管理不同的角色,同時爲聲明性授權提供role_symbols方法。

現在的問題是,我得到這個奇怪的錯誤,雖然Authorization.current_user是由application_controller.rb設置的。

這是一份procude錯誤我的一個資源控制器begning:

class PubResponsablesController < ApplicationController 

    before_filter :authenticate_admin_utilisateur! 
    filter_resource_access 

    ... 
end 

我通過谷歌搜索這個錯誤,但沒有任何結果提供了一個可行的解決方案。 有人能幫助我嗎?

非常感謝

回答

2

好的,這是最終答案。

我修改我的應用程序/控制器/ application_controller.rb因爲我沒有在視圖中使用@current_user實例變量:

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    # This is mandatory if you want to secure as well your app/models 
    before_filter :set_current_user 

    # This method is required by declarative_authorization on every controller 
    # that is using filter_resource_access (or any other declarative_auth.. mechanism) 
    def current_user 
    current_admin_utilisateur 
    end 

    protected 

    def set_current_user 
    Authorization.current_user = current_admin_utilisateur 
    end 
end 

正如我所說的,我用下面的寶石協作:

寶石devise的認證 的用戶模型名稱是「admin_utilisateur」,而不是「用戶」,但也有可能是:帳戶,會員,團體或你所需要的。

寶石role_model提供一個高明的作用方法「role_symbols」我的用戶模型 *的方法role_symbols是返回一個「設置」子類,而不是一個「陣列」,但之後快速開機Github上,開發商(martinrehfeld )以幾分鐘的閃電事件修復了這個兼容性問題。太棒了!*

gem declarative_authorization提供基於角色的訪問管理。 我將使用與「用戶」不同的型號名稱將通過以下post確認工作。

declarative_authorization需要的唯一東西是每個控制器上的current_user方法。由於我在Devise中使用了不同的模型名稱(如admin_utilisateur,account,member,...),devise創建的助手具有不同的名稱。而不是current_user,它是current_admin_utilisateur(或current_account,current_member)。所以我必須創建我自己的current_user方法。

role_symbols declarative_authorization所需的方法由role_model gem提供。

我希望這可以幫助其他開發者,因爲我花了兩天的時間來理清所有這些結構如何協同工作。設計讓我更加擔心路由問題。

我幾分錢到RoRrrr ;-)

0

好吧,我設法改變我的應用程序/控制器/ application_controller.rb解決這個錯誤:

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    before_filter :set_current_user 

    def current_user 
    @current_user = current_admin_utilisateur 
    end 

    protected 

    def set_current_user 
     Authorization.current_user = current_admin_utilisateur 
    end 
end 

我剛剛創建創建一個實例變量@current_user我自己CURRENT_USER方法。這個初始化值是基於Devise helpers的current_admin_utilisateur值和我自定義的用戶模型admin_utilisateur。 (我的模型可能也被稱爲acount,成員,或任何...

我把我的CURRENT_USER方法application_controller,以便它在我的應用程序的每個控制器可用。現在

,我發現了另一個錯誤:

User.role_symbols doesn't return an Array of Symbols (#<RoleModel::Roles: {:developer, :admin, :coordinator, :manager, :assistant, :distributor, :exporter, :historian}>) 

我不明白,因爲roles_model寶石提供一個別名法「role_symbols」到admin_utilisateur模型。

相關問題