如何解决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 举报,一经查实,本站将立刻删除。