1

我一直在努力让康康舞一整天都在工作。我已经使用不同的教程重新开始了几次,但我不断收到相同的错误。

这很简单,我有一个用户帐户(使用 Devise 创建),它可以有一个角色,管理员或用户。这是能力等级:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    if user.role? :admin
      can :manage, :all
    end
  end
end

在配置文件控制器中,我有一行load_and_authorize_resource,用户包含的类ROLES = %w[admin user]。要去http://localhost:3000/profiles/给我错误

wrong number of arguments (2 for 1)app/models/ability.rb:6:in初始化'`

使用替代方法user.admin?给出

undefined method `admin?' for #<User:0x5b34c10>

谷歌搜索上面的错误会得到很多结果,所以我不是唯一遇到这个问题的人,但没有一个解决方案对我有用。

是的,我已将角色列添加到用户表

class AddRoleToUsers < ActiveRecord::Migration
  def change
    add_column :users, :role, :string
  end
end

添加 Gem,运行 bundle install 并重新启动服务器。

4

1 回答 1

0

如果你有以下这应该工作:

能力.rb

class Ability
  include CanCan::Ability
  def initialize(user)
    user ||= User.new # guest user
   # raise user.role?(:administrator).inspect
    if user.role? :administrator

      can :manage, :all
      can :manage, User

    elsif user.role? :user
      can :read, :all

    end

  end
end

角色用户.rb

class RoleUser < ActiveRecord::Base
  # attr_accessible :title, :body
  belongs_to :user
  belongs_to :role

end

角色

class Role < ActiveRecord::Base
  attr_accessible :name

  has_and_belongs_to_many :users
end

用户.rb

 class User < ActiveRecord::Base

 has_and_belongs_to_many :roles

  def role?(role)
    self.roles.find_by_name(role.to_s.camelize)
  end

在定义角色、查找角色、将角色转换为字符串并将其骆驼化时,您需要这个。

种子.rb

%w(Employee Administrator).each { |role| Role.create!(:name => role)}

创建一个数组UserAdministrator.

如果您正确遵循这些步骤,您应该可以正常工作。并确保您具有以下迁移:

class UsersHaveAndBelongsToManyRoles < ActiveRecord::Migration
  def self.up
    create_table :roles_users, :id => false do |t|
      t.references :role, :user
    end
  end

  def self.down
    drop_table :roles_users
  end
end

然后在您看来,您应该can?通过执行类似的操作来使用

<% if can? :manage, User %> 
  .......
    ....
  ...
<% end %> 
于 2013-02-26T06:19:56.300 回答