Ruby on rails 控制器的未初始化常数

Ruby on rails 控制器的未初始化常数,ruby-on-rails,cancan,Ruby On Rails,Cancan,嗨,我正在尝试使用cancan,但我有一个非常恼人的错误,即:未初始化的常量版 对于控制器: class EditionsController < ApplicationController before_filter :authenticate_user! #devise load_and_authorize_resource def index end end 以及这些能力: user ||= User.new # guest user (not logged in)

嗨,我正在尝试使用cancan,但我有一个非常恼人的错误,即:未初始化的常量版

对于控制器:

class EditionsController < ApplicationController
  before_filter :authenticate_user! #devise
  load_and_authorize_resource
  def index
  end
end
以及这些能力:

user ||= User.new # guest user (not logged in)
if user.has_role? "admin"
  can :manage, Edition
  cannot :commission
else
  can :read, :commission
end
还有一个问题,我如何为singularname控制器创建cancan功能?
例如,PhotoController

问题在于您使用的是自定义类

CanCan试图将控制器类名单数化以匹配模型类名,但有时这并不是我们所期望的:

如果模型类的名称空间与控制器不同,则需要指定:class选项

资料来源:

在我的例子中,我有一个没有模型的类,所以我只是在命令末尾添加了:class=>false:

load_and_authorize_resource :class => false
如果您在ApplicationController中定义了load_和authorize_资源,并且只想为此控制器覆盖它:

class EditionsController < ApplicationController
  skip_load_and_authorize_resource

  def index
    @editions = Edition.accessible_by(current_ability).order(:date)
  end
end

你有一个名为Edition的ActiveRecord模型吗?是的,我就是,我将load_和_authorize_资源更改为authorize_资源:class=>false。这种对配置的约定可能非常具有欺骗性。当然还有:版本而不是版本
class EditionsController < ApplicationController
  skip_load_and_authorize_resource

  def index
    @editions = Edition.accessible_by(current_ability).order(:date)
  end
end