2017-01-18 2 views
1

私はクラスのユーザーとページの間に以下の関係があります。cancancan has_and_belongs_to_manyの能力

class User < ApplicationRecord 
    has_and_belongs_to_many :pages 
end 

class Page < ApplicationRecord 
    has_and_belongs_to_many :users 
end 

自分の能力ファイルで、ユーザーが自分に属しているページのみを編集できるようにするにはどうすればよいですか?

class Ability 
    include CanCan::Ability 
    def initialize(user) 
     if user.is? :page_administrator 
     can :manage, Page 
     end 
    end 
end 

私は次のことを試みますが、それでも私はできません。

can :manage, Page, users: { user_id: user.id } 

答えて

3

has_and_belongs_to_manyの最大の問題は、データを結合テーブルに添付することができなくなることです。代わりに参加するモデルを使用します。

class User < ApplicationRecord 
    has_many :user_pages 
    has_many :pages, through: :user_pages 
end 

class Page < ApplicationRecord 
    has_many :user_pages 
    has_many :users, through: :user_pages 
end 

class UserPage < ApplicationRecord 
    belongs_to :user 
    belongs_to :page 
end 

これは、ヘッドレスではない以外has_and_belongs_to_manyように動作します - あなたは直接UserPageを照会することができます。 UserPageモデルの作成以外に、テーブルの名前をusers_pagesからuser_pages(またはpages_usersからpage_users)に変更するだけです。

class RenameUsersPages < ActiveRecord::Migration[5.0] 
    def change 
    rename_table('users_pages', 'user_pages') 
    end 
end 

レールがそうでなければ、一定Users::Pageにテーブルをリンクしますので、これは必要とされています。

UserPageテーブルにadminフラグを簡単に付けることができます。

class Ability 
    include CanCan::Ability 
    def initialize(user) 
     can :manage, Page do |p| 
     p.user_pages.exists?(admin: true, user: user) 
     end 
    end 
end 
+0

あなたは[rolify宝石](httpsをチェックアウトすることをお勧めします:// githubのをユーザーがレコードがuser_pagesに存在するかどうかをチェックすることにより、管理者である場合

class AddPageAdministratorToUserPages < ActiveRecord::Migration[5.0] change_table :users do |t| t.boolean :admin, default: false end end 

今、私たちは確認することができます。 com/RolifyCommunity/rolify)は、多くのクラスにわたってロールベースの認可のフレームワークを提供します。 – max

関連する問題