真的很困惑。根据{{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'
你可以说我只是在学习!即使是正确方向的推动也会令人惊叹。感谢。
答案 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