微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。