创建专家策略以 API 控制器方法



如何使用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

我有相同和相应ModelController

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

#posts_controller.rb
class PostsController < ApplicationController
def create
......
end

def update
......
end
def delete
......
end
end

我已经为posts controller创建了策略。如何为 API 的控制器创建相同的内容

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

无论您是否从 Api::P ostsController 调用:

# /app/controllers/api/posts_controller.rb
class Api::PostsController < ApplicationController
def create
@post = Post.find(params[:post_id])
authorize @post
end
end

或从您原来的帖子控制器:

# /app/controllers/posts_controller.rb
class PostsController < ApplicationController
def create
@post = Post.find(params[:post_id])
authorize @post
end
end

只要@postPost类的成员,就可以从父级或子级的控制器或完全不相关的控制器调用authorize @post,没关系。在所有情况下,权威人士都会在应用程序/策略/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

最新更新