2014-03-06 94 views
3

我使用RailsApps rails-composer來創建一個rails-devise-pundit啓動器應用程序。我還是有點新的紅寶石在軌道上,更新的設計,評論家和導軌4.user.admin在哪裏?在rails-devise-pundit starter app中定義?

我在看代碼,以瞭解它是如何工作的。控制器和策略類中有很多地方是user.admin?叫做。但我找不到管理員?方法。我希望它在用戶模型中,但它不在那裏。這裏的用戶等級:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, :confirmable, 
     :recoverable, :rememberable, :trackable, :validatable 
    enum role: [:user, :vip, :admin] 
    after_initialize :set_default_role, :if => :new_record? 

    def set_default_role 
    self.role ||= :user 
    end 
end 

用於users_controller.rb的一部分:

def show 
    @user = User.find(params[:id]) 
    unless current_user.admin? 
    unless @user == current_user 
     redirect_to root_path, :alert => "Access denied." 
    end 
    end 
end 

是否pundit或設計原因形成這種方法嗎?我已經看到它在權威文檔中使用,但它只是用它作爲例子。它沒有說方法需要被創建或者它處理它。它以某種方式使用具有以下作用的枚舉:admin作爲可能的值?如果任何人都可以解釋這是如何工作的,我會很感激。

我打算儘快使用rolify gem來處理角色,而不是用戶類中的角色枚舉。也許我會想出一些因爲某些原因完全不同的角色名稱。我想確保我明白如何讓所有工作都能正常進行。謝謝。

回答

9

角色定義在app/models/User.rb文件(User模型)中。

class User < ActiveRecord::Base 
    . 
    . 
    . 
    enum role: [:user, :vip, :admin] 
    after_initialize :set_default_role, :if => :new_record? 

    def set_default_role 
    self.role ||= :user 
    end 

end 

該應用程序使用的ActiveRecord enum方法來管理角色。 ActiveRecord的提供了方便的方法來查詢角色屬性:

user.admin! # sets the role to "admin" 
user.admin? # => true 
user.role # => "admin" 

查看文檔ActiveRecord::Enum瞭解詳情。 ActiveRecord enum方法在Rails 4.1中是新的。

我已更新rails-devise-pundit應用程序的自述文件以包含此信息。它也覆蓋在我的Rails Pundit Tutorial

+0

謝謝。這正是我需要知道的。我需要花時間閱讀4.1文檔。 –

0

這是User模型的一個屬性。與first_namelast_name相同,有一個叫做admin的字段,它是一個布爾值。

+0

用戶模型中沒有稱爲admin的字段。它不在User類中,它在用戶數據庫表中沒有定義。有一個名爲角色的枚舉。它可以具有以下值:admin或:vip或:user,如我的原始文章中的類列表中所示。這似乎是user.admin?正在訪問。我只想知道哪些寶石正在做這項工作。在用戶模型中有一個叫做「角色」的枚舉有什麼魔力?在rails控制檯中,我用user.vip試過了這個?和user.user ?.當我更改角色字段的值時,它都可以正常工作。我只是不明白爲什麼。 –