如何使用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
我有相同和相应Model
的Controller
控制器路径:/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
只要@post
是Post
类的成员,就可以从父级或子级的控制器或完全不相关的控制器调用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