cancancan 能力在测试中按预期工作,但在实践中却没有?

问题描述

我的评价设置类似于 Airbnb。

这些能力应该允许客人评论主人,主人评论客人:

# ability.rb
can [:show],[Review] do |review|

  if review.reviewable_type == "Host" 
    review.booking.guest_id == user.guest.id 

  elsif review.reviewable_type == "Guest" 
    review.booking.host_id == user.host.id 

  end 
 
end

这是控制器:

class ReviewsController < ApplicationController
  authorize_resource
  before_action :set_review,only: [:show]

  def show
  end

  private
    def set_review
      @review = Review.find_by_id(params[:id])
    end
end

测试时,一切正常

host = Host.first

review = Review.first # A review of a host

ability = Ability.new(host.user)
ability.can?(:show,review)
# Returns false as expected

review2 = Review.second # A review of a guest
ability.can?(:show,review2)
# Returns true as expected

所以到目前为止一切都很好。

但是当我以主持人的身份登录并亲自访问评论时,我可以自己进行评论!在控制台中测试时,上面的确切逻辑拒绝访问。

为什么可以在控制台中阻止访问,而在浏览器中允许访问?

解决方法

完全是菜鸟错误。

我有

  authorize_resource
  before_action :set_review,only: [:show]

但是 authorize_resource 应该在为动作设置模型实例的 before_action 之后调用。

所以在这个简单的重新排序之后,它按预期工作:

  before_action :set_review,only: [:show]
  authorize_resource

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...