如何在使用CanCan时启用管理员销毁记录?

时间:2014-06-21 06:51:26

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 cancan

我目前的代码是这样的。
只有发布的用户才能销毁自己的记录 但是我想启用admin(user.id = 1)来删除所有记录。

我该怎么改变?还看?任何聪明的方式?

/models/ability.rb

def initialize(user)
    if user
        can :read, :all 
        can [:create, :destroy], Comment, {:user_id => user.id}
        can [:destroy], Comment, {:commentable_id => user.id, :commentable_type => user.class.name}
        can [:create, :update], Community, {:user_id => user.id}
    else
        can :read, :all 
    end
end

查看

<%= link_to 'x', polymorphic_path([@user, comment]),
    :data => { :confirm => 'Do you want to delete?' },  
    :method => :delete, :disable_with => 'Deleting', 
    :remote => true, 
    :class => 'close'
if current_user && current_user.id == comment.user_id || current_user && current_user.id == comment.commentable_id %>

2 个答案:

答案 0 :(得分:1)

这是你需要的。顺便说一句,使用user.id == 1来检查管理员权限是个坏主意,可能更好的解决方案是将布尔admin字段添加到User模型。如果您不想这样做,可以将if user.admin?替换为if user.id == 1

def initialize(user)
  guest_ability
  user_ability(user) if user
  admin_ability if user.admin? # or `if user.id == 1` if you don't want to add `admin` field
end

private

def admin_ability(admin)
  can [:destroy], Comment
end

def user_ability(user)
  can :read, :all 
  can [:create, :destroy], Comment, { :user_id => user.id }
  can [:destroy], Comment, { :commentable_id => user.id, :commentable_type => user.class.name }
  can [:create, :update], Community, { :user_id => user.id }
end

def guest_ability
  can :read, :all
end

在您看来:

<% if can? :destroy, comment %>
  <%= link_to 'x', polymorphic_path([@user, comment]),
        :data => { :confirm => 'Do you want to delete?' },  
        :method => :delete, :disable_with => 'Deleting', 
        :remote => true, 
        :class => 'close' %>
<% end %>

答案 1 :(得分:1)

在你的异能文件中,你应该区分用户可以拥有的各种角色,所以你应该添加像

这样的东西。
if user.has_role? :admin
  can :destroy, Comment
end

在您看来,您现在应该使用罐头而不是自己做的工作&#34;,而不是现在正在做的事情?方法,如下

if can? :destroy, comment

使用可以吗?将使用您在能力文件中描述的路线。就这么简单!