如何为访客用户正确配置Devise + Cancan

时间:2013-02-15 03:24:25

标签: ruby-on-rails devise cancan

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

我无法理解设置此选项的“正确”方法,特别是控制器中需要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 Controller

#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

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

如果我从应用程序控制器中删除before_filter :authenticate!,我会从uninitialized constant Home

收到错误activesupport-3.2.11/lib/active_support/inflector/methods.rb

如果我从家庭控制器中删除load_and_authorize_resource,则此错误消失。

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

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

1 个答案:

答案 0 :(得分:3)

问题在于没有资源可以授权。因此,您只需拨打authorize_resource而不是load_and_authorize_resource。有关详细信息,请参阅cancan文档中的authorizing controller actions

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

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

class HomeController < ActionController::Base
  authorize_resource class: false

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

此信息位于Non-RESTful controllers section。对于那个很抱歉。