为 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
只要 @post
是 Post
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
如何使用 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
只要 @post
是 Post
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