多くのエージェントを持つパートナーのリソースと、多くのエージェントを持つユーザーを取得しました。
Cancan&RolifyでPartenaireごとにアクセスを制限したい。
私が見つけた唯一のハックは、user.agence_idsとpartenaire.agence_idsの配列サイズを評価し、それが1以上であるかどうかを評価して、ユーザーがPartenaireにアクセスできるようにすることです。
カスタム アクションを実行して、Index ビューを Partenaires_controller にフィルター処理しました。
パートナーとユーザーが少なくとも 1 つのエージェントを共有している場合、ユーザーにアクセスを許可することは可能ですか?
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.has_role? :admin
can :access, :rails_admin # grant access to rails_admin
can :dashboard # grant access to the dashboard
can :manage, :all
elsif user.has_role? :user
can [:index, :edit, :update, :show, :new, :create], Partenaire do |partenaire|
(user.agence_ids & partenaire.agence_ids).size >= 1
end
end
end
end
Partenaires_controller.rb
def index
flash[:ville] = params[:id]
@ville = flash[:ville]
#Permet l'affichage des partenaire sur un tri de ville
if current_user.has_role? :user
if params[:id] == 'ALL' || params[:id].nil?
@partenaires = @search.includes(:agences).where(['agences.id IN (?)', current_user.agence_ids]).order(:ville, "partenaires.nom asc")
elsif params[:id] != 'ALL' && !params[:id].nil?
@partenaires = @search.where(:ville => params[:id]).order("ville, nom asc").where(:id => current_user.agence_ids)
end
elsif current_user.has_role? :admin
if params[:id] == 'ALL' || params[:id].nil?
@partenaires = @search.order("ville, nom asc")
elsif params[:id] != 'ALL' && !params[:id].nil?
@partenaires = @search.where(:ville => params[:id]).order("ville, nom asc")
end
end
ユーザー.rb
class User < ActiveRecord::Base
rolify
has_and_belongs_to_many :agences
end
Agence.rb
class Agence < ActiveRecord::Base
has_and_belongs_to_many :users
has_and_belongs_to_many :partenaires
Partenaire.rb
class Partenaire < ActiveRecord::Base
has_and_belongs_to_many :agences