问题描述
我的评价设置类似于 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