2017-05-12 4 views
1

Ich habe eine Rolle in der Fähigkeit cancancan gem deklariert (Schienen 5, postgres, ersinnen):cancancan Zeilenfilters

can [:update, :show, :destroy, :index], SalesDatum do |datum| 
    datum.try(:user_id) == user.id #the ids just access the id's from the user object that is passed into can can and from the table 
end 

SalesDatum hat ein user_id Feld.

Dies wirkt sich auf die Show Aktionen, denn ich kann nur show die SalesDatum, die der angemeldete user_id Zum Beispiel hat:

http://localhost:8080/projects/19/sales_data/961 korrekt authentifiziert wird, weil das in User_id angemeldet entspricht dem user_id auf der Verkaufsdaten

http://localhost:8080/projects/19/sales_data/800 bekommt nicht korrekt authentifiziert, weil die in user_id protokolliert nicht die user_id auf der Verkaufsdaten

jedoch überein, wenn ich auf die ge gehen t Index Aktion: http://localhost:8080/projects/19/sales_data Es zeigt alle Verkaufsdaten von der @sales_data Variable. So würde es zeigen die data.id 800 und 961.

Verkaufsdaten-Controller:

load_and_authorize_resource 
def index 
    @sales_data = SalesDatum.where(project_id:params[:project_id]) 
end 

Wie bekomme ich den Index Aktion nur zeigen die Daten mit dem entsprechenden User_id? Sollte Cancan das nicht nach der user_id filtern?

+0

Ich kann die Controller-Abfrage zu 'SalesDatum.where (project_id: params [: project_id]) bearbeiten. Where (user_id:' current_user.id') 'Aber das scheint eine wirklich schlechte Art der Authentifizierung zu sein? – HoosierCoder

+0

Das ist der Grund, warum ich CanCanCan zugunsten von Pundit aufgegeben habe - das täuschend einfache DSL ist nicht sehr gut darin, Authentifizierungsbereiche zu definieren oder irgendetwas nicht-triviales zu handhaben. – max

Antwort

1

Sie müssen die Regel mit der Hash-Syntax definieren.

can [:update, :show, :destroy, :index], SalesDatum, user_id: user.id 

Sie können auch die edit Aktion definieren wollen und deshalb:

can [:edit, :update, :show, :destroy, :index], SalesDatum, user_id: user.id 

die in vereinfacht werden kann:

can :manage, SalesDatum, user_id: user.id 

wenn SalesDatum ein belongs_to :user definiert hat, können Sie auch schreiben:

can :manage, SalesDatum, user: user 
+0

Das ist großartig, gibt es keinen guten Weg, dies mit der Block-Syntax zu tun? – HoosierCoder

+1

Die Block-Syntax sollte immer die letzte sein, da sie nur für die Instanz und nicht für die Sammlung funktioniert. Für Sammlungen müssen Sie die Hash-Syntax verwenden. – coorasse

Verwandte Themen