0

在 Rails 3.2 应用程序中,我使用的是 Devise + CanCan。该应用程序以前仅限于登录用户访问。我正在添加能够阅读网站某些部分的访客用户/能力。

我无法理解设置它的“正确”方法,特别是控制器中需要before_filter :authenticate!什么组合。load_and_authorize_resource

在做这个的时候,我已经把能力等级降到了最低限度。

#Ability.rb
class Ability
  include CanCan::Ability

  def initialize(user_or_admin)
    user_or_admin ||= User.new

    can :manage, :all
  end
end

在无模型/静态页面 Home 控制器中

#home_controller.rb
class HomeController < ApplicationController
  load_and_authorize_resource
  def index
    ...some stuff
  end
end

#application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :authenticate!
  ...more stuff
end

通过此设置,未登录的用户将被重定向到 Devise 登录页面。

如果我从应用程序控制器中删除,我会收到before_filter :authenticate!一个错误uninitialized constant Homeactivesupport-3.2.11/lib/active_support/inflector/methods.rb

如果我load_and_authorize_resource从家庭控制器中移除,这个错误就会消失。

这对我的简化测试能力类来说没问题,但是当我开始添加角色和能力时,我需要让 CanCan 处理 Home 控制器,即需要load_and_authorize_resource调用。

任何人都可以帮助我理解为什么在before_filter :authenticate!删除时会发生此错误,并指出任何解释为来宾用户设置 Devise+Cancan 的“正确”方法的信息。到目前为止我发现的信息只解释了如何设置能力类,而不是如何配置设计。

4

1 回答 1

3

问题是没有资源可以授权。因此,您只需调用authorize_resourcenot load_and_authorize_resource。有关更多信息,请参阅cancan 文档中的授权控制器操作

更新:您还必须将类指定为 false: authorize_resource class: false

然后您的家庭控制器将如下所示:

class HomeController < ActionController::Base
  authorize_resource class: false

  def show
    # automatically calls authorize!(:show, :home)
  end
end

此信息位于非 RESTful 控制器部分。对于那个很抱歉。

于 2013-02-15T03:26:59.537 回答