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

Checking action parameters in Rails CanCanCan Authorization

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

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

回答

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

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

如果我没理解错的话,您使用的是 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 行为。