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

时间:2018-01-17 22:30:49

标签: ruby-on-rails ruby ruby-on-rails-5 pundit

如何使用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控制器创建相同的

1 个答案:

答案 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

或来自您原来的Pos​​tsController:

# /app/controllers/posts_controller.rb

class PostsController < ApplicationController

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

只要@postPost类的成员,您就可以从父母或孩子的控制者或完全不相关的控制器调用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