为 API 控制器方法创建 Pundit 策略

Create Pundit Policies to API controller methods

如何使用 Pundit gem 为 API 控制器创建 Policies

Api 控制器路径:/app/controllers/api/posts_controller.rb

#posts_controller.rb

class Api::PostsController < ApplicationController

  def create
  ......
  end


  def update
  ......
  end

  def delete
  ......
  end

end

我有 Controller 对应 Model

控制器路径:/controllers/posts_controller.rb

#posts_controller.rb

class PostsController < ApplicationController

  def create
  ......
  end


  def update
  ......
  end

  def delete
  ......
  end

end

我已经为 posts controller 创建了策略。如何为 API 的 Controller

创建相同的内容

Pundit 是基于资源的,而不是基于控制器的。当您调用 authorize 并向其传递资源时,Pundit 会关心操作名称和资源类型,但不会关心控制器名称。

无论您是否从Api::PostsController调用:

# /app/controllers/api/posts_controller.rb

class Api::PostsController < ApplicationController

  def create
    @post = Post.find(params[:post_id])
    authorize @post
  end
end

或来自您原来的 PostsController:

# /app/controllers/posts_controller.rb

class PostsController < ApplicationController

  def create
    @post = Post.find(params[:post_id])
    authorize @post
  end
end

只要 @postPost class 的成员,您就可以从父或子的控制器或完全不相关的控制器调用 authorize @post , 没关系。在所有情况下,Pundit 都会在 app/policies/post_policy:

中寻找名为 create? 的方法
# app/policies/post_policy.rb

class PostPolicy < ApplicationPolicy

  attr_reader :user, :post

  def initialize(user, post)
    @user = user
    @post = post
  end

  def create?
    user.present?
  end
end