如何使用Pundit强制对单一资源进行范围界定?

时间:2015-06-22 23:13:30

标签: ruby-on-rails pundit

我的应用程序中有一些独特的资源,例如:

# routes.rb
MySite::Application.routes.draw do
  resource :thing
end

# things_controller.rb
class ThingsController < ApplicationController
  def edit
    load_thing
  end

  def update
    load_thing
    if @thing.update_attributes(thing_params)
      ...
    else
      ...
    end
  end

  private

  def load_thing
    @thing ||= current_user.thing
  end

  def thing_params
    params.require(:thing).permit(...)
  end
end

我想知道如何使用Pundit强制执行策略范围设定(before_action :verify_policy_scoped已设置ApplicationController)。

我不确定如何形成我的单一资源的政策范围,即:

# thing_policy.rb
class ThingPolicy < ApplicationPolicy
  Scope < Scope
    def resolve
      # What to do here...
      # scope => ?
    end
  end
end

# things_controller.rb
def load_thing
  # ...and what to do here
  @thing ||= policy_scope(...)
end

根据Pundit's docs

  

...方法resolve ...应该返回某种可能的结果   迭代过来。

但是,对于单一资源,这个iterability子句并不真正有效,并且没有AR样式的范围......只是一条记录。

有人对如何解决此问题有任何建议吗?

1 个答案:

答案 0 :(得分:0)

通常在@thing操作上执行范围限制,以限制用户在应用筛选之前可以访问的基本记录集。对于个人记录,您应该current_user代替他们。

无论如何,您已经将before_action :verify_policy_scoped范围限定为only: [:index]

建议将User限制为UserController.js