【问题标题】:uninitialized constant Ability Rails未初始化的常量技能导轨
【发布时间】:2014-12-16 12:05:30
【问题描述】:

我已经针对此问题提供了不同的解决方案,但它们都不起作用,所以请不要尝试以重复的方式关闭问题。

我的用户表中有角色列。所以用户可以通过adminuser,我需要使用CanCan 将权限放在用户角色的基础上。我想将所有权限授予管理员。我以管理员身份登录,但是当我访问/users 时,我收到错误uninitialized constant Ability,当我删除load_and_authorize_resource 时,我的cancan 权限不起作用。我的能力类看起来像

class Ability
  include CanCan::Ability

  def initialize(user)
    #abort("Message goes here")
    user ||= User.new # guest user
    #abort('some user')
    if user.role == 'admin'
      can :manage, :all
    elsif user.role == 'user'
      can :manage, Micropost do |micropost|
        micropost.try(:owner) == user
      end
      can :update, User do |users|
        users.try(:owner) == user
      end
    else
     can :read, :all
    end
  end
end

在我的UsersController 我有

class UsersController < ApplicationController
  load_and_authorize_resource
  #devise code
  before_filter :authenticate_user!, only: [:index, :edit, :update, :destroy, :following, :followers]
  blah blah
 end

我的路线文件看起来像

FirstApp::Application.routes.draw do

  devise_for :users

  resources :users do
  member do
    get :following, :followers
  end
end
#resources :sessions, only: [:new, :create, :destroy]
resources :microposts, only: [:create, :destroy]
resources :relationships, only: [:create, :destroy]

root to: "static_pages#home"

match '/help', to: 'static_pages#help'
match '/about', to: 'static_pages#about'
match '/contact', to: 'static_pages#contact'
end

【问题讨论】:

  • 您的ability.rb 文件是否位于app/models 目录下?
  • 也许这是显而易见的事情,但无论如何:尝试重新启动您的服务器和/或 spring。当您捆绑新的 gem 或添加新的初始化程序时,您通常必须重新启动您的乘客/独角兽/等(如果您使用它们)来更新自动加载的常量。
  • @sjaime 哦,对不起。我的错。它不在模型目录中。这就是原因。谢谢你。如果你能回答,我会接受。 :-)

标签: ruby-on-rails ruby devise cancan


【解决方案1】:

您看到uninitialized constant Ability 是因为您的UsersController 中的load_and_authorize_resource 方法希望找到一个Ability 类。

解决方案是将包含你的能力定义的文件移动到app/models/ability.rb

#app/models/ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    #abort("Message goes here")
    user ||= User.new # guest user
    #abort('some user')
    if user.role == 'admin'
      can :manage, :all
    elsif user.role == 'user'
      can :manage, Micropost do |micropost|
        micropost.try(:owner) == user
      end
      can :update, User do |users|
        users.try(:owner) == user
      end
    else
     can :read, :all
    end
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多