- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
关于获得 Rails 5 和 Pundit 授权使用命名空间的问题。
对于 Pundit,我想在 Controller 中使用 policy_scope([:admin, @car]
它将使用位于以下位置的 Pundit 策略文件:app/policies/admin/car_policy.rb
.我在尝试让 Pundit 使用此 namespace 时遇到问题 - 没有 namespace ,它工作正常。
应用程序正在运行:
我的命名空间是 admins
例如。
route.rb
文件看起来像:
# config/routes.rb
devise_for :admins
root: 'cars#index'
resources :cars
namespace :admin do
root 'cars#index'
resources :cars
end
我设置了 Pundit ApplicationPolicy
并让命名空间与 Pundit 的 authorize
一起工作方法:@record = record.is_a?(Array) ? record.last : record
# app/policies/application_policy.rb
class ApplicationPolicy
attr_reader :user, :record
def initialize(user, record)
@user = user
@record = record.is_a?(Array) ? record.last : record
end
def scope
Pundit.policy_scope!(user, record.class)
end
class Scope
attr_reader :user, :scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
scope
end
end
end
在Admin::CarsController
这有效 authorize [:admin, @cars]
class Admin::CarsController < Admin::BaseController
def index
@cars = Car.order(created_at: :desc)
authorize [:admin, @cars]
end
def show
@car = Car.find(params[:id])
authorize [:admin, @car]
end
end
但我想使用策略范围
class Admin::CarPolicy < ApplicationPolicy
class Scope < Scope
def resolve
if user?
scope.all
else
scope.where(published: true)
end
end
end
def update?
user.admin? or not post.published?
end
end
在Admin::CarsController
class Admin::CarssController < Admin::BaseController
def index
# @cars = Car.order(created_at: :desc) without a policy scope
@cars = policy_scope([:admin, @cars]) # With policy scope / doesn't work because of array.
authorize [:admin, @cars]
end
def show
# @car = Car.find(params[:id]) without a policy scope
@car = policy_scope([:admin, @car]) # With policy scope / doesn't work because of array.
authorize [:admin, @car]
end
end
我收到一个错误,因为 Pundit 没有在寻找 Admin::CarPolicy
.我猜这是因为它是一个数组。
我想在 Controller 中我可以做类似 policy_scope(Admin::Car)
的事情但这不起作用:)。
非常感谢任何助手。
我在 Pundit Github 问题页面上找到了这个:https://github.com/elabs/pundit/pull/391
这修复了我想要的 policy_scope 的命名空间处理。
它更新了 Pudit gem -> policy_scope!
lib/pundit.rb
中的方法.
来自:
def policy_scope!(user, scope)
PolicyFinder.new(scope).scope!.new(user, scope).resolve
end
收件人:
def policy_scope!(user, scope)
model = scope.is_a?(Array) ? scope.last : scope
PolicyFinder.new(scope).scope!.new(user, model).resolve
end
我的问题是,如何在我的 Rails 应用程序中使用它?是叫重载还是猴子补丁?
我在考虑添加 pundit.rb
在config/initializer
目录和使用 module_eval
但不确定如何做 policy_scope!
在里面module Pundit
和 class << self
.
我认为这行得通,但行不通 - 假设是因为 policy_scope!
在里面class << self
.
Pundit::module_eval do
def policy_scope!(user, scope)
model = scope.is_a?(Array) ? scope.last : scope
PolicyFinder.new(scope).scope!.new(user, model).resolve
end
end
最佳答案
Medir 在 Pundit Github 问题页面上发布了解决方案。
只需将您的 application_policy.rb 更改为:
class ApplicationPolicy
index? show?....
class Scope
attr_reader :user, :scope
def initialize(user, scope)
@user = user
# @scope = scope
@scope = scope.is_a?(Array) ? scope.last : scope #This fixes the problem
end
def resolve
scope
end
end
end
然后你可以使用:
policy_scope([:admin, @cars])
关于ruby-on-rails - 获得 Pundit 授权使用 Namespaces on Rails 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42454424/
我创建、更新和销毁“喜欢”的政策要求用户登录。 我已将政策措辞如下: class LikePolicy < ApplicationPolicy def create? user && re
我一直在努力思考策略的概念,这看起来很简单——策略是一组规则,据此确定对系统权限和资源的访问。 足够简单。 因此,为了让系统内的用户访问该系统内所有其他用户的列表,他们需要必要的凭据(例如,可能是管理
我已经阅读了关于同一主题的几个问题,但没有一个能解决我的疑问或对我有用。 Pundit 无法在我的代码中找到命名空间策略,但我不明白为什么。我有一个“后端”命名空间,每当调用此“后端”中的 items
将 Rails 4.2.4 与 Devise (3.5.2) 和 Pundit (1.0.1) 结合使用。 Decent_exposure (2.3.2)。 我有一个简单的 User 和 Idea 嵌
在我的项目中,我有非常常见的命名空间“admin”。 namespace :admin do resources :users, except: :show end 我使用 Pundit ge
我对 Rails 很陌生,但我对以下策略有疑问(使用 Pundit ):我想比较两个对象:@record和 @foo ,正如你在这里看到的: class BarPolicy < Application
我在我的 Rails 应用程序上使用 Pundit 进行授权,我正在对我的请求进行单元测试。 我已经成功测试了该策略,但现在我想验证我的请求是否使用了该策略。 我想以一种通用的方式来做,我可以在任何请
我刚刚开始在 Rails 4 应用程序中使用 Pundit gem 进行授权。 一切都很顺利,但我可以了解分页在索引操作中如何工作。 我的 Controller 的索引操作如下所示: def inde
我刚刚开始在 Rails 4 应用程序中使用 Pundit gem 进行授权。 一切都很顺利,但我可以了解分页在索引操作中如何工作。 我的 Controller 的索引操作如下所示: def inde
我正在为我的学校作业授权,这是一个 Reddit 克隆。我刚刚被介绍给 Pundit Gem,用于对用户角色进行授权,即管理员、版主、成员和访客。 我必须这样做: Admins and Moderat
我通过连接表将用户与给定公司相关联,因为我需要能够让每个公司都有大量用户,反之亦然。 class User has_many :firm_connections, dependent: :dest
所以我决定尝试pundit用户授权解决方案。我想知道如何在实例变量可能为 nil 的情况下使用 policy 助手,如下面的简单情况: 应用/views/projects/index.html.sli
在一个练习中,我试图创建授权,这样用户就需要是帖子的所有者或一般管理员,除了在场并登录才能更新帖子。我正在尝试实现 pundit策略(使用 Devise 进行身份验证)。 PostController
我在我的封闭系统 Ruby on Rails 应用程序(使用 Rails 4.1.5 和 Rspec 3.0)上使用 Pundit gem 进行授权 我已将我的应用程序策略配置为在未按照 Pundit
工具 Pundit授权;试验 this pull request链接到官方 Pundit 自述文件; ActiveInteraction域服务对象(“DSO”); RSpec 2.99.1 ** 项目
我对使用这个 Pundit gem 还很陌生,但似乎无法理解政策系统。我添加了检查 Pundit 已被调用以进行授权 ( verify_authorized ) 和范围界定 ( verfify_pol
我试图弄清楚如何将 Pundit 与我的命名空间资源一起使用。 我读过很多其他人的帖子,说他们对此有问题,但这些帖子早于关于专家 gem 问题跟踪器的讨论。问题跟踪器不清楚解决方案是什么 - 所以我被
我正在使用 Rails 5.2、Pundit 1.1 和 rails_admin 1.2 我的 application_controller.rb 中有以下内容: class ApplicationC
Pundit 的 authorize 有 3 个参数,但在 Controller 中你只需要传递 2 个参数,current_user 会自动传递。 current_user 是如何传递的?我查看了
在带有 activeadmin gem(当前主分支)的 Rails 4 应用程序中,我使用 Pundit 进行授权。它适用于资源,但我无法使其适用于页面。 例如: ActiveAdmin.regist
我是一名优秀的程序员,十分优秀!