我的应用程序中有一些独特的资源,例如:
# 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
...方法
resolve
...应该返回某种可能的结果 迭代过来。
但是,对于单一资源,这个iterability子句并不真正有效,并且没有AR样式的范围......只是一条记录。
有人对如何解决此问题有任何建议吗?
答案 0 :(得分:0)
通常在@thing
操作上执行范围限制,以限制用户在应用筛选之前可以访问的基本记录集。对于个人记录,您应该current_user
代替他们。
无论如何,您已经将before_action :verify_policy_scoped
范围限定为only: [:index]
建议将User
限制为UserController.js