每个用户CanCan的一个角色,未定义的方法'角色'问题

时间:2011-09-05 11:22:32

标签: ruby-on-rails ruby authorization roles cancan

真的很困惑。根据{{​​3}}设置角色并正常运行。我的用户模型如下。

class User < ActiveRecord::Base

    ROLES = %w[admin landlord]

    def role?(role)
     roles.include? role.to_s
    end
 end

当我将权限添加到我的能力模型时,我收到以下错误。

undefined method `role' for #<ActionDispatch::Session::AbstractStore::SessionHash:0x10433a5e0>

我的能力模型如下。

class Ability
  include CanCan::Ability

  def initialize(user)
    if user.role == "admin"
      can :manage, :all
    else
     can :read, :all
    end
  end
end

这就是我在终端看到的内容。

NoMethodError (undefined method `role' for #<ActionDispatch::Session::AbstractStore::SessionHash:0x1044d46a8>):
  app/models/ability.rb:5:in `initialize'
  app/controllers/application_controller.rb:6:in `new'
  app/controllers/application_controller.rb:6:in `current_ability'

你可以说我只是在学习!即使是正确方向的推动也会令人惊叹。感谢。

2 个答案:

答案 0 :(得分:1)

问题在于您定义了role?方法但在ability.rb中调用role方法当然是未定义的

正确的方法是

def initialize(user)
  if user.role? "admin"
    can :manage, :all
  else
    can :read, :all
  end
end

答案 1 :(得分:0)

您正在将会话传递给CanCan。您需要传递当前登录的用户。我猜测您的rails book的解释,应该有一种方法可以从变量会话中访问该用户。将该用户作为该能力的参数传递。

如果用户未登录,我会发送新用户。

您需要重构代码,例如:

def current_ability
  if session[:user_id]  # Replace with the method to get the user from your session
    user = User.find(session[:user_id])
  else
    user = User.new
  end

  @current_ability ||= Ability.new(user)
end