- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
与 Pundit 遇到一些我不明白的事情,
使用 Rails 4.2.5.1、Pundit 1.1.0 和 Devise 进行身份验证。
我正在尝试对 BlogController#Index 操作使用策略范围。
出现错误:
undefined method `admin?' for nil:NilClass
Live shell 揭示:
>> user
=> nil
# ApplicationController
class ApplicationController < ActionController::Base
include Pundit
rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
private
def user_not_authorized
flash[:error] = "You are not authorized to perform this action."
redirect_to(request.referrer || root_path)
end
end
# BlogController
# == Schema Information
#
# Table name: blogs
#
# id :integer not null, primary key
# title :string default(""), not null
# body :text default(""), not null
# published :boolean default("false"), not null
# created_at :datetime not null
# updated_at :datetime not null
#
class BlogsController < ApplicationController
before_action :set_blog, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, except: [:index, :show]
after_action :verify_authorized, except: [:index, :show]
after_action :verify_policy_scoped, only: [:index]
def index
@blogs = policy_scope(Blog)
authorize @blog
end
def show
end
def new
@blog = Blog.new
authorize @blog
end
def edit
authorize @blog
end
def create
@blog = Blog.new(blog_params)
@blog.user = current_user if user_signed_in?
authorize @blog
if @blog.save
redirect_to @blog, notice: "Blog post created."
else
render :new
end
end
def update
authorize @blog
if @blog.update(blog_params)
redirect_to @blog, notice: "Blog updated."
else
render :edit
end
end
def destroy
authorize @blog
@blog.destroy
redirect_to blogs_url, notice: "Blog post deleted."
end
private
def set_blog
@blog = Blog.friendly.find(params[:id])
end
def blog_params
params.require(:blog).permit(*policy(@blog|| Blog).permitted_attributes)
end
end
# Application Policy
class ApplicationPolicy
attr_reader :user, :record
def initialize(user, record)
@user = user
@record = record
end
def index?
false
end
def show?
scope.where(:id => record.id).exists?
end
def create?
false
end
def new?
create?
end
def update?
false
end
def edit?
update?
end
def destroy?
false
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
# Blog Policy
class BlogPolicy < ApplicationPolicy
class Scope < Scope
def resolve
if user.admin?
scope.all
else
scope.where(published: true)
end
end
end
def new?
user.admin?
end
def index?
true
end
def update?
user.admin?
end
def create?
user.admin?
end
def destroy?
user.admin?
end
def permitted_attributes
if user.admin?
[:title, :body]
end
end
end
在我创建的 Pundit BlogPolicy 范围中:
class Scope < Scope
def resolve
if user.admin?
scope.order('id DESC')
else
scope.where('published: true')
end
end
end
If I log in as an
admin user
it works fine.
我可以查看所有博客文章。
If I log in as a standard
user
it works.
标准用户会看到标记为已发布的博客文章。
If I'm not logged in where
user is nil
I get an error:
NoMethodError at /blog
undefined method `admin?' for nil:NilClass
我可以在 user.admin?
或 case when
语句之前添加另一个子句 elsif user.nil?
,但我认为如果用户不是管理员,它应该只显示 else block 中的内容?
# This seems wrong?
class Scope < Scope
def resolve
if user.nil?
scope.where('published: true')
elsif user.admin?
scope.all
else
scope.where('published: true')
end
end
end
非常感谢任何指点
最佳答案
您可以使用尝试:
if user.try(:admin?)
# do something
end
http://api.rubyonrails.org/v4.2.5/classes/Object.html#method-i-try
关于ruby-on-rails - 专家policy_scope错误: undefined method `admin?' for nil:NilClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35508904/
随着技术的快速发展和数字化转型的深入推进,软件测试行业正面临着前所未有的变革。2024年,我们可以预见软件测试行业将呈现出几个重要的趋势将深刻影响软件测试的方式、工具和流程。它们将重塑软件测试的格局,
我正在尝试解决 Expert F# 中的一个示例,该示例基于 v1.9.2,但此后的 CTP 版本已经发生了足够的变化,以至于某些它们甚至不再编译。 我在处理 list 13-13 时遇到了一些麻烦。
我正在尝试在 Drools Expert 中编写规则。在规则的 when 部分,我检查了 Application 对象的一些属性。该对象包含一个列表,我想检查一组规则是否适用于该列表中 SomeOth
我一直在尝试自学 Lambdaj,它似乎不想随机化我的字符串数组。我是否应该将字符串添加到列表中以便能够使用 Lambdaj 处理集合。我想要做的就是获取一组字符串并使用 LambdaJ 以随机顺序打
我正在构建一个多模块 Maven 网络应用程序项目,但在我的 Tomcat 服务器上部署 WAR 时遇到了问题。 我的项目结构是 我的应用程序 我的应用架构 MyAppUtils MyAppWs 问题
所以我要在我的网站上添加一个 SVG。我还通过更改一个名为 "background-svg" 的类来调整此 svg 的大小以适合我的大部分屏幕,您将在下面的代码中看到该类。 基本上,如果您将 SVG
我有依赖性 javax.servlet com.springsource.javax.servlet 2.5.0 在我的 pom 文件中,但显示错误。 Missing ar
我在调试问题上花了几个小时只是为了让更有经验的人查看 IL(类似于 00400089 mov dword ptr [ebp-8],edx )并指出问题。老实说,这对我来说看起来像希伯来语 - 我不知道
今天,笔者将从应用原理出发,解析固态硬盘三大基础知识,看完它们,再也不用担心不会挑不会用固态硬盘啦。 1、接口篇 了解需求选对接口 目前,市面上销售的消费级固态硬盘产品中,大都是SATA接口或是
在我的 Web 应用程序中,我终于达到了实现简单要求变得势不可挡的地步。我猜是时候进行不错的重构或简单的垃圾重做了。 以下是我需要在表上实现的简单要求: 1) 使列可排序2) 卡住 2 个标题行和前
为什么这段代码: function answer(x) { function closure() { var x = x || 42; console.log(x); }
我是 Drools 的新手 我尝试将 drools 的示例 hello world 实现到我的项目中,它似乎工作得很好,但我真的被 困扰了Drools 依赖,因为我真的不知道它有什么用。只是想知道我是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
我知道 mySQL 5.x 不支持 INTERSECT,但这似乎是我需要的。 表 A:产品 (p_id) 表 B:Prod_cats (cat_id) - 类别信息(名称、描述等) 表 C:prod_
如何成为 jQuery no.conflict 专家? 我经常遇到 jQuery 与 Prototypes JS 的冲突错误。而且我不是 jquery 专家。 我还能解决所有的冲突问题吗。如何获得解决
我有两个 Spring Boot 项目,想将其中一个用作其他项目的 MAVEN 依赖项。 Project Scraper 依赖数据库项目 项目数据库包含数据库层(实体和 DAO 在这里构建和测试) 在
在命令行帮助中,我看到maven“检查”了更新: -U,--update-snapshots Forces a check for updated
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
数据在 A2:K2 中: =LET(txt, TEXTJOIN("", FALSE, 0, --A2:K2, 0), modTxt, SUBSTITUTE(txt, "0.5", 1), halfDa
VCL 的一个常见情况是构建一个组件,然后使用驻留在主机 Frame 或 Form 中的代码填充其事件处理程序(如果组件具有事件)。 Delphi 6 IDE 能够非常方便地将组件从其宿主 Frame
我是一名优秀的程序员,十分优秀!