1

Wie kann ich eine Aktion von einem Controller ohne ein Modell basierend auf einem anderen Modellobjekt autorisieren?Pundit kopflose Richtlinie für verschachtelte Ressource

Nehmen wir an, ich habe ein Modell namens Server und ich habe einen verschachtelten Controller namens config_files_controller, der kein entsprechendes Modell hat.

Ich möchte in der Lage sein, die Aktionen von der config_files_controller basierend auf einem Server-Objekt und aktuellen Benutzer und den für Server definierten Richtlinien zu autorisieren.

In routes.rb ich habe:

resources :servers do 
    resources :config_files do 
    collection do 
     get 'load_file' 
    end 
    end 
end 

Die config_files_controller.rb sieht ungefähr so ​​aus:

class ConfigFilesController < ApplicationController 
    before_filter :authenticate_user! 
    before_filter :load_server 

    def index 
    # displays file names 
    end 

    def load_file 
    # gets file content 
    end 

    private 

    def load_server 
    @server = Server.find(params[:server_id]) 
    authorize :config_file, "#{action_name}?" 
    end 
end 

In configuration_file_policy.rb würde ich so etwas haben mag:

class ConfigurationFilePolicy < Struct.new(:user, :configuration_file, :server) 
    def index? 
    ServerPolicy.new(user, server).show? 
    end 

    def load_file? 
    ServerPolicy.new(user, server).update? 
    end 
end 

Ich vermisse wahrscheinlich etwas oder ich sehe nur die offensichtliche Lösung nicht. Jeder Vorschlag wäre willkommen!

Danke!

Antwort

1

Ihr Controller setzt @server Objekt, und Server scheint ein Modell zu sein. Daher sollte es ausreichen, dies zu genehmigen. (Keine Notwendigkeit für ConfigurationFilePolicy.)

config_files_controller.rb

... 

def index 
    authorize @server, :show? 
    # displays file names 
    ... 
end 

def load_file 
    authorize @server, :update? 
    # gets file content 
    ... 
end 

https://github.com/elabs/pundit#policies

+0

Ich wusste, dass ich es war overcomplicating! Vielen Dank! –

Verwandte Themen