2017-04-07 77 views
1

如何在没有基于其他模型对象的模型的情况下授权来自控制器的操作?嵌套资源的权威无头策略

假设我有一个名为Server的模型,并且我有一个名为config_files_controller的嵌套控制器,它没有相应的模型。

我希望能够基于Server对象和当前用户以及为Server定义的策略来授权来自config_files_controller的操作。

在routes.rb中我有:

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

的config_files_controller.rb看起来是这样的:

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 

在configuration_file_policy.rb我想有这样的事情:

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 

我可能错过了一些东西,或者我只是没有看到明显的解决方案。任何建议,将不胜感激!

谢谢!

回答

1

您的控制器设置了@server对象,而Server似乎是一个模型。因此它应该足以授权。 (无需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

我知道我是过于复杂了!谢谢! –