2015-12-20 75 views
2

我最近使用Rails Composer和devise創建了一個小型Rails應用程序。將管理員角色添加到Rails應用程序

然後,我使用本指南按照指南將用戶表的管理員屬性設置爲:https://github.com/plataformatec/devise/wiki/How-To:-Add-an-Admin-Role

在app /視圖/佈局/ _nav_links_for_auth.html.erb

,我有:

<% if user_signed_in? %> 
    <% if current_user.try(:admin?) %> 
    <li> <%= link_to 'Users', users_path %></li> 
    <% end %> 
<% end %> 

我已經將該屬性設置爲true的用戶

我與這件事掙扎我登錄爲 - 但是,如果current_user.try(:admin?)上面的語句不返回true。我已經在sqlite開發數據庫中檢查了兩倍,該屬性實際上設置爲true,並且是。

所以,我卡住了。盡我所知,它並不知道「管理員」實際上是什麼。在我的用戶模型中,我有這個(默認情況下是這樣):

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

    ... 
end 

我希望得到這項工作的一些幫助。我需要做什麼?

+0

你可以更新'set_default_role' – anoop

回答

0

爲什麼你有一個enum如果你有你的User模型明確admin屬性?

如果您使用enum,你就會有一個role屬性,它會給你的方法,如admin?,或者你需要有一個明確的admin屬性 - 它應該有,如果你已經打響了migration你發佈。

要清除任何潛在的混淆,如果您對某列有嚴格的標準,並且希望用戶具有指定的某些值,則可以使用enumRoles是一個很好的例子:

#app/models/user.rb 
class User < ActiveRecord::Base 
    enum role: [:admin, :user] #-> requires "role" column which will store either :admin (0) or :user (1) values 
end 

你的情況,你有幾個問題。

首先,boolean列上創建模型中的適當的方法列... 有admin作爲boolean列會給你@user.admin?方法。

<%= content_tag :li, link_to('Users', users_path) if user_signed_in? && current_user.admin? %> 

這是你應該用什麼如果你有遷移,你從Devise鏈接說明(即你有一個admin布爾列)

-

第二個問題,你有你在你的模型中感到困惑。

IF你想有一個默認的角色,並有一個enum定義的潛在作用,你想使用下列內容:

#app/models/user.rb 
class User < ActiveRecord::Base 
    enum role: [:user, :vip, :admin] 
    # remove after_init callback 
end 

你會設置一個默認作用在你的數據庫設置role默認值:

$ rails g migration SetDefaultRole 

#db/migrate/set_default_role_______.rb 
class SetDefaultRole < ActiveRecord::Migration 
    def change 
     add_column :users, :role, :integer, default: 1 
    end 
end 

$ rails db:migrate #-> if you're using Rails 5 
$ rake db:migrate #-> Rails 4+ 
+1

謝謝Rich很重要,我現在明白了問題所在。從你的答案中,我能夠得到該屬性的工作,但也決定使用管理員的實際角色。就我而言,正如我使用Rails Composer和Devise一樣,它已經具有管理員角色,我根本不知道(因爲這是我第一次將身份驗證添加到我的Rails應用程序中),我所要做的就是設置管理員角色在數據庫中。我想現在會有一個後續問題,而不是直接在數據庫中設置角色,最好的設置方法是什麼?謝謝! – LovingRoR

+0

沒問題,希望你有一個偉大的聖誕節 –

0

您可以使用任一role枚舉或admin屬性,但不是兩個。

你的情況的問題是admin?被調用的方法是由enum(它檢查角色)定義的方法,而不是由activerecord爲布爾列提供的方法admin?

因此,雖然您的admin列爲真,但您的角色未設置爲管理員(因爲我們無法調查,因爲您的set_default_role實施不可用)。

我建議採用基於角色的系統,調查爲什麼沒有設置正確的角色,然後擺脫admin列。

+0

謝謝 - 現在對我來說這很清楚。對於set_default_role我有: def set_default_role self.role || =:用戶 結束 – LovingRoR

相關問題