【问题标题】:CANCAN undefined method `user_type?' for "admin":StringCANCAN 未定义方法 `user_type?'对于“管理员”:字符串
【发布时间】:2011-05-13 09:34:50
【问题描述】:

这是我的问题:

我正在使用 cancan gem。我认为一切都设置得很好,除了一件事,它产生undefined method 'user_type?' for "admin":String。

这是我的能力.rb

class Ability
  include CanCan::Ability
  def initialize(user)
       user ||= User.new # guest user
       if user.user_type? :admin
         can :manage, :all
       # [code code code code commented to find more easily the problem]
        else
          can :read, :all
        end
  end
end

我的用户.rb

require 'digest/sha2'

class User < ActiveRecord::Base
  #definisco i ruoli
  ROLES = %w[admin client banned]
  default_scope :order => 'user' [...]

我不知道我必须修改什么。为什么if user.user_type? :admin 不检查当前用户属性?非常感谢您的关注!

UP:好的,我读到了cancan需要在应用程序控制器中声明的方法“current_user”。现在我正在努力。新闻,很快。

【问题讨论】:

  • 你在哪里定义了user_type?方法?
  • 你在哪里检查授权?什么控制器? (如果它是控制器)请也粘贴该代码。这是因为不知何故,传递给CanCan 的user 变量是一个值为"admin" 的字符串——你希望user 实际上是一个User 实例。
  • 解决了!!!进入ability.rb if user.user_type == "admin" 在应用程序控制器中我添加 def current_user @current_user = User.find_by_id(session[:user_id]) end 谢谢!

标签: ruby-on-rails authorization gem cancan


【解决方案1】:

你应该这样做。我认为这是更好的方法。

将角色植入 DB。

并在应用程序助手中粘贴此代码。

def is_admin?(user)
  admin_role = Role.find(:first, :conditions => ["name = ?", "admin"])
  return user.roles.include?(admin_role)
end

然后在技能调用中像

            class Ability
             include CanCan::Ability
             def initialize(user)
               user ||= User.new # guest user
                 if is_admin?(user)
                   can :manage, :all
                    # [code code code code commented to find more easily the problem]
                 else
                   can :read, :all
                 end
             end
           end

它会正常工作.......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多