在Rails CanCanCan授权中检查操作参数

时间:2017-09-05 16:25:23

标签: ruby-on-rails ruby-on-rails-5 cancancan

ability.rb中定义能力时是否可以访问控制器参数?

我有一个活动和可以参与或创建该活动的用户。似乎我可以为每种可能的场景创建不同的控制器动作,例如用户为某个事件签名,或者创建者从该事件中删除某人。但是我认为阅读更少的动作并且能够根据从客户端传入的参数来定义能力会更容易。

答案

@chumakoff在下面有一些很好的信息,有助于解释CanCanCan是如何工作的。我决定默认在ability.rb中授权这些操作,然后引发错误,例如raise CanCan::AccessDenied.new("You cannot delete someone else from this event"),如果我检测到发送的用户/事件参数ID不正确,则在控制器中。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您使用的是cancan的authorize_resourceload_and_authorize_resource控制器帮助程序,可根据控制器操作名称计算用户能力。

但是,对于所有操作,不必使用此帮助程序。您可以跳过具有复杂能力逻辑和手动检查能力的操作。

例如:

class ParticipationsController < ApplicationController
  authorize_resource except: :create # skiping `authorize_resource` for `create` action

  # ...

  def create
    if creator_adds_someone_to_event?
      authorize! :add_to, @event
    end

    if user_signs_up_for_event?
      authorize! :sign_up_for, @event
    end
    # ...
  end

因此,您可以在同一个控制器动作中检查许多不同的能力。只需禁用操作的默认cancancan's行为。

答案 1 :(得分:-2)

是的,有一个名为“pry”的调试工具。使用它会帮助你。只需使用binding.pry,无论你想在哪里检查代码中的参数值,控制台都会在那一刻停止执行,这样你就可以检查参数的值。