如何使用Policies
为API控制器创建Pundit gem
?
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控制器创建相同的
答案 0 :(得分:1)
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
只要@post
是Post
类的成员,您就可以从父母或孩子的控制者或完全不相关的控制器调用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