0

私の質問は、「それは正しいことですか?」のように、絶対に理論的です。私は特にRailsとRuby全般に不慣れであり、RailsアプリケーションにCancan自動化ソリューションを使用しようとしています。

このような単純なコントローラー、関連付けられたビューのペア、およびDBテーブルを持つユーザーモデルがあると考えてみましょう。

class UsersController < ApplicationController
  def index
    @users = User.all
  end
  def show
    @user = User.find(params[:id])
  end
end

目標は、「index」メソッドへのアクセスを管理者以外のすべてに制限し、通常のユーザーが自分のページのみを表示できるようにすることです。たとえば、id==5のユーザーがページ「users/5」を表示できるようにします。このスコープのために、Cancanの能力クラスを作成しました。ここにあります:

class Ability
  include CanCan::Ability

  def initialize user, options = {}
    default_rules
    if user
      admin_rules(user) if user.role.eql? "admin"
      player_rules(user) if user.role.eql? "player"
    end
  end

  def admin_rules user
    can :read, UsersController
  end

  def player_rules user
    can :read, User do |user_requested|
      user_requested.id == user.id
    end 
  end

  def default_rules 
  end
end

私の質問は次のとおりです。Userタイプの便利なものがない場合、「can」メソッドのオブジェクトとしてUsersControllerを使用する必要がありますか?コントローラの「index」メソッドで「authorize!:show、UsersController」を使用して後で適用します。それとも他の方法で行う必要がありますか?ご提案ありがとうございます。

4

4 に答える 4

2

いいえ、UsersControllerをCanCanに追加したくありません。

CanCanは、Railsコントローラーではなく、リソースを承認することを目的としています。

私は次のことを提案します:

def initialize(user)
  if user.is_admin?
    can :manage, User
  else
    can :manage, User, :id => user.id
  end
end

これにより、ユーザーは管理者でない限り、自分のユーザーにのみアクセスできます。CanCanWikiの能力の定義ページを参照してください

于 2012-05-14T22:35:52.780 に答える
0

私は、例えば、能力クラスでシンボルを使用します

def initialize(user)
  if user.is_admin?
    can :any, :admin
  end
end

とコントローラーで

authorize! :any, :admin
于 2012-05-14T21:47:02.690 に答える
0

@Tigraineに+1。

彼の指示に従ってください...

class Ability
  include CanCan::Ability

  def initialize user, options = {}
    default_rules
    if user
      admin_rules(user) if user.role.eql? "admin"
      player_rules(user) if user.role.eql? "player"
    end
  end

  def admin_rules user
    can :manage, User
  end

  def player_rules user
    can :manage, User :id => user.id
  end

  def default_rules 
  end
end

コントローラーでこれを行います...

class UsersController < ApplicationController
  load_and_authorize_resource
  # => @users for index
  # => @user for show

  def index
  end
  def show
  end
end

load_and_authorize_resourceの詳細については、このリンクの下部を参照してください

于 2012-05-16T07:42:07.187 に答える
0

ウィキで、能力を設定する別の方法を見つけました。ちょっと進んでいますが、こちらをチェックしてください

   ApplicationController.subclasses.each do |controller|
        if controller.respond_to?(:permission)  
          clazz, description = controller.permission
          write_permission(clazz, "manage", description, "All operations")
          controller.action_methods.each do |action|
...
于 2012-05-17T01:39:09.637 に答える