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_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 Homeが発生します。activesupport-3.2.11/lib/active_support/inflector/methods.rb

load_and_authorize_resourceホームコントローラーから削除すると、このエラーはなくなります。

これは私の簡略化されたテスト能力クラスでは問題ありませんが、役割と能力を追加し始めると、CanCanにホームコントローラーを処理させる必要があります。つまり、load_and_authorize_resource呼び出す必要があります。

誰かが削除されたときにこのエラーが発生する理由を理解するのを手伝ってくれますか?before_filter :authenticate!ゲストユーザーのためにDevise+Cancanを設定する「正しい」方法を説明する情報を教えてください。これまでに見つけた情報は、Abilityクラスの設定方法のみを説明しており、Deviseの構成方法は説明していません。

4

1 に答える 1

3

問題は、承認するリソースがないことです。したがって、呼び出す必要があるのは。ではありauthorize_resourceません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 に答える