Pundit针对嵌套资源的无头策略

时间:2017-04-07 17:07:01

标签: ruby-on-rails ruby-on-rails-3.2 nested-resources pundit

如何在没有基于其他模型对象的模型的情况下从控制器授权操作?

假设我有一个名为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 个答案:

答案 0 :(得分:2)

您的控制器设置了@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