Rails 4 – Pundit – 制定政策

我正试图弄清楚如何在我的Rails 4应用程序中使用pundit。

我有一个配置文件视图,我想在其中显示一个链接来创建一个新项目,但需要获得权威授权。

我尝试了以下每种配方:

     "btn btn-info" %>  

项目和简介之间的关联是:

项目

 belongs_to :profile 

轮廓

 has_many :projects, dependent: :destroy 

我的项目政策有:

 def new? true # create? end def create? true end 

当我在配置文件视图中尝试使用此行时:

我收到一条错误消息:

错误的参数数量(给定2,预期为0)

当我在配置文件视图中尝试使用此行时:

我收到一条错误消息:

错误的参数数量(给定2,预期为0)

当我在配置文件视图中尝试使用此行时:

我收到一条错误消息:

无法找到零的政策

当我在配置文件视图中尝试使用此行时:

我收到一条错误消息:

未定义的局部变量或方法`project’for 你的意思是? project_url

如果视图页面在不同的模型中(例如,配置文件,测试该配置文件的授权是否可以创建项目),我是否需要做一些特殊的测试项目授权? 我被困在猜测如何解决这个问题。

在我的项目控制器中,我有一个创建方法:

 def create @project = Project.new(project_params) @project.profile = current_user.profile respond_to do |format| if @project.save format.html { redirect_to @project } format.json { render :show, status: :created, location: @project } else format.html { render :new } format.json { render json: @project.errors, status: :unprocessable_entity } end end end 

该政策的初始化者:

 class ProjectPolicy < ApplicationPolicy attr_reader :user, :record def initialize(user, record) @user = user @record = record end 

看起来您的代码可能没有必要的实例变量。 在你的show方法中你应该有一个@project – 你可以使用Pundit检查用户是否可以创建它。

由于您似乎没有@project ,您可以尝试这样做:

 <% if policy(Project.new).create? %> 

您也可以尝试使用符号:

 policy(:project) <% if policy(:dashboard).show? %> <%= link_to 'Dashboard', dashboard_path %> <% end %> 

你有这样的政策定义吗?

 # app/policies/project_policy.rb class ProjectPolicy < Struct.new(:user, :project) # ... end 

通常我会在视图中使用另一个类,比如说ViewPolicy:

 class ViewPolicy < Struct.new(:user, :views) def items_index? user.has_role?(:sales) end end 

所以我可以这样做:

 <% if policy(:views).items_index? %> <%= link_to("Items", items_path) %> <% end %> 

与@Kieran Andrews非常相似