2017-07-17 7 views
0

私のレールアプリケーションでは、管理者、マネージャ、顧客として3つのユーザーレベルが必要です。 私はadmin、manager、customerとして3つのdeviseモデルを作成しました。 私のアプリケーションには、製品、配送、サービス用のモデルとコントローラがあります。 各モデルにアクセスレベルを設定したいと思います。レール(cancan gem)のさまざまなユーザー役割のモデルへのアクセスを制限する方法は?

だから管理者は

お客様は私がこれらの要件に Iを照合する機能モデルを書くことができますどのようにサービス

へのアクセス権を持って配達、コントローラ

Managerが製品へのアクセス権を持っている、すべてのモデルへのアクセス権を持っていますそれは次のように書かれています。正しいかどうか分かりません。

class Ability 
    include CanCan::Ability 
    def initialize(user) 
     # Define abilities for the passed in user here. For example: 
     # 
      user ||= User.new # guest user (not logged in) 
      if user.admin? 
      can :manage, :all 
      elsif user.manager? 
      can :manage, product ,delivery 
      elsif user.customer? 
      can :manage, services 
      end 
    end 

、別のユーザーの役割のアクセスを制限するためのモデルのコードを書くために私を助けてください。 私を助けてくれるようにしてください!

答えて

0

私はこれに取り組む最も簡単な方法があなたのコントローラにあると思います。コントローラ付きのブックモデルを持っていて、管理者がこの部分にアクセスできるようにしたいとします。それはあなたの予約コントローラにメソッドを作成し、アクションメソッドの前に使用してそれを呼び出すために、おそらく最善です:

class BookingsController < ApplicationController 
    before_action :check_admin 

    def check_admin 
    return unless admin_signed_in? 
    redirect_to root_path, error: 'You are not allowed to access this part of the site' 
    end 
end 

これはcheck_admin方法に何かが予約コントローラで発生するたびに実行されます、そして、あなたのルートパスにリダイレクトします管理者がサインインしていない限り、Deviseにはuser_signed_inも付属していますか?とmanager_signed_in?これらの名前のモデルを作成した場合は、ヘルパーです。

あなたは、例えば

before_action :check_admin, only: [:edit, :create, :delete, :update, :new] 

はのみ、コントローラのアクションの前にチェックを実行し、誰もがインデックスとshowアクションにアクセスできるようになる、コントローラのアクションは、アクションを実行するかを決めることで、この多くを調整することができます。

+0

ありがとうございました。とても役に立ちました:) –

関連する問題