2015-01-29 9 views
11

ich mit Rails ziemlich neu bin und ich habe ein Problem mit den folgenden Richtlinien (mit Pundit): Ich möchte zwei Objekte vergleichen: @record und @foo, wie Sie hier sehen können:Pundit Politik mit zwei Eingangsparameter

class BarPolicy < ApplicationPolicy 
    def show? 
    @record.foo_id == @foo 
    end 
end 

Ich bin nicht in der Lage, einen guten Weg zu finden, um einen zweiten Parameter zu pundit Methoden (@foo) zu übergeben.

Ich möchte etwas tun:

class BarsController < ApplicationController 
    def test 
    authorize bar, @foo, :show? # Throws ArgumentError 
    ... 
    end 
end 

Aber der Pundit authorise Methode erlaubt nur zwei Parameter. Gibt es eine Möglichkeit, dieses Problem zu lösen?

Danke!

Antwort

12

Ich fand die Antwort bei here.

Hier ist meine Art und Weise:

hinzufügen pundit_user Funktion in ApplicationController:

class ApplicationController < ActionController::Base 
include Pundit 
def pundit_user 
    CurrentContext.new(current_user, foo) 
end 

Erstellen Sie die CurrentContext Klasse:

/lib/pundit/current_context.rb 
class CurrentContext 
    attr_reader :user, :foo 

    def initialize(user, foo) 
    @user = user 
    @foo = foo 
    end 
end 

Aktualisieren Sie die initialize Pundit-Methode.

class ApplicationPolicy 
    attr_reader :user, :record, :foo 

    def initialize(context, record) 
    @user = context.user 
    @foo = context.foo 
    @record = record 
    end 
end 
+0

Ja [dies ist] (https://github.com/elabs/pundit#additional-context) korrekte Art, es zu dokumentieren. –